Header-Dateien von C++ in C# nutzen
-
Hallo Forum
ich habe mal eine Frage bezüglich der Einbindung von C++ Code in C#. Ich habe eine Header Datei (hdisdi.h, Headerdatei aus dem Windows DDK), die ich gerne in C# nutzen würde. Andere Methoden aus dem DDK sind in eine DLL verpackt, die ich ohne Probleme bisher in C# importieren konnte. Nur diese Headerdatei hat keine .lib oder .dll, die ich importieren könnte. Daher nun meine Frage: Gibt es eine Möglichkeit, C++- Headerdateien für C# nutzbar zu machen?
Vielen Dank für eure Hilfe!
-
Nein, C++ Header Files können nicht in C# eingebunden werden.
Was u.U. möglich ist, dass Du managed (.NET) Deklarationen von Typen bzw. Funktionen erstellest, und dir dabei als Vorlage die C++ Header Files nimmst.Das Thema heisst Managed/Unmanaged Interoperabiltät. Da gehts drum aus z.B. C# nativ (unmanaged) C++ Funktionen aufzurufen.
Was möchtest Du erreichen?
Ist es wirklich optimal .NET als Runtime zu nehmen?Gruss
Simon
-
Hallo Simon
erstmal vielen Dank für deine Antwort.
Ich möchte eine Kommunikation mit einem Controller über USB herstellen. Der Controller wird von Windows als HID erkannt. Bisher klappt soweit alles ganz gut. Mein Problem ist, dass ich gerne den Namen des Devices auf meiner GUI anzeigen lassen möchte. Dazu gibt es aus der HID-Klasse die Funktion
HidD_GetProductString()
Die Methode steht allerdings in der hidsdi.h, und ist nicht in der hid.dll enthalten. Da ich keine andere Möglichkeit kenne, den Namen des Devices zu bekommen, wollte ich jetzt mal schauen ob es eine Möglichkeit gibt, die Methode aus dieser .h Datei irgendwie in C# zu nutzen.
C# deshalb, da später noch mit WebServices gearbeitet werden soll, wo in .net einfach schon eine Menge implementiert ist.
Grüße
samo
-
HidD_GetProductString ist in HID.dll implementiert.
(Findest Du in system32 Folder).Edit:
Benutzen kannst Du die Funktion mit P/Invoke.Gruss Simon
-
Danke, jetzt hat das Einbinden funktioniert. Allerdings komme ich mit dem richtigen P/Invoke noch nicht so richtig klar, zumindest scheint es so, denn die Funktion liefert nicht das erwartete Ergebnis.
In c++ ist die Funktion folgendermaßen deklariert:
BOOLEAN HidD_GetProductString( HANDLE HidDeviceObject, PVOID Buffer, ULONG BufferLength );
In meinem Code sieht das dann so aus:
[DllImport("hid.dll")] static public extern bool HidD_GetProductString(int Handle, IntPtr Buffer, UInt32 BufferLength);
Aufgerufen wird die Methode im Code dann so:
IntPtr buf = new IntPtr(128); uint sz = 128; HID_GetName(_HIDHandle, buf, ref sz);
Ich glaube, dass ich die falsche Bufferlänge angebe, da ich leider gar nicht weiss, wie ich denn von einem IntPtr die Länge bestimme (hat der überhaupt eine Länge?).
Ich weiss nun nicht, ob mein Fehler im Aufruf der Methode liegt oder schon beim marshallen der Methode und ihrer Parameter.Bin für jeden Hinweis dankbar.
-
Zumindestens der IntPtr als Puffer ist falsch.
Du mußt selber einen Puffer bereitstellen, in dem die Funktion dann den Namen reinkopieren soll.Gibt es denn die Methode sowohl als ASCII- als auch Unicode-Variante(W)?
Denn da in C# ein 'char' aus 2 Bytes besteht, solltest du die 2. Version aufrufen.char [] buf = new char[128]; uint sz = 128; HID_GetName(_HIDHandle, buf, sz); // HID_GetProductString ???
-
Wunderbar, danke, so funktionierts! Die HidD_GetProductString() ist in Hid_GetName() gepackt, da ich dann noch weitere Dinge in der Funktion mit dem Rückgabewert der HidD_GetProductString() mache.