Wie um die Karte von Win32-Datentypen auf C# - Datentypen bei der Verwendung von P/Invoke?
Ich versuche, etwas zu tun, wie diese in C#. Ich fand heraus, wie zum aufrufen von Win32-Methoden aus C# mit P/Invoke von diesem link. Allerdings traf ich einige Schwierigkeiten bei der Umsetzung von P/Invoke.
Beispielsweise eine der Methoden, die ich zugreifen möchte ist PdhOpenQuery,
Signatur:
PDH_STATUS PdhOpenQuery(
__in LPCTSTR szDataSource,
__in DWORD_PTR dwUserData,
__out PDH_HQUERY *phQuery
);
Ich herausfinden, dass der entsprechende C# - Deklaration sollte so etwas wie dieses
[DllImport("Pdh.dll")]
static extern PDH_STATUS PdhOpenQuery(LPCTSTR szDataSource,
DWORD_PTR dwUserData, out PDH_HQUERY *phQuery);
Meine Fragen:
Was ist LPCTSTR und welchen Datentyp hat es anzeigen in C#?
Wie um die Karte einen Typ Zeiger DWORD_PTR? Die pinvoke-Artikel sagt DWORD-maps UInt32, aber wie über Zeiger?
Ich denke, PDH_STATUS und PDH_HQUERY spezifische Struktur der Bibliothek (die ich mir noch nicht sicher bin). wie kann ich diese Karte?
Was ist die richtige Methode der Erklärung, und wie nennt man es richtig?
Du musst angemeldet sein, um einen Kommentar abzugeben.
LPCTSTR
ist ein typedef fürconst TCHAR*
.TCHAR
ist ein Versuch, zu abstrahieren von der Tatsache, dass die Windows-API existiert in beiden "ANSI" (char
Zeichenfolgen in einer locale-specific encoding) und "Unicode" (UTF-16) - Versionen. Es gibt keine eigentlichePdhOpenQuery
Funktion; es ist einPdhOpenQueryA
Funktion, die einen ANSI-string und einePdhOpenQueryW
Funktion, die eine UTF-16-string.C# verwendet UTF-16-Zeichenfolgen, so dass Sie wollen lieber das "W" - version dieser Funktionen. Verwenden
PdhOpenQueryW
. Dann der erste parameter hat den C++ - Typconst wchar_t*
. Der C# - Typ ist[MarshalAs(UnmanagedType.LPWStr)] string
.DWORD_PTR
ist kein Zeiger. Es ist ein unsigned integer groß genug, um halten einen Zeiger. Der entsprechende C# - Typ istSystem.UIntPtr
.PDH_STATUS
erscheint nur einint
.PDH_HQUERY
ist ein Zeiger auf ein handle (andere Zeiger), aber Sie können nur so tun, es ist ein integer und verwendenIntPtr
.Setzen Sie alle zusammen, Ihre Erklärung sollte sein:
UIntPtr
sollteUIntPtr dwUserData
? Eine andere Frage, wie sollte man die Methode aufrufen?IntPtr
und verwenden Sie dann diePtrToStringAnsi
oderPtrToStringUni
Funktionen in derSystem.Runtime.InteropServices.Marshal
- Klasse auf den string.iirc LPCTSTR bricht um:
LP == Long Pointer //Relikt von 16 - zu 32-bit thunking
C == Konstant
TSTR == TStr //TString, eine Art Platzhalter, die ersetzt für verschiedene Arten von strings in Abhängigkeit von verschiedenen C-Header und #definiert
was es für Sie bedeutet: es wird ein Zeiger auf einen string für C# einfach string verwenden, und du wirst in Ordnung sein.
PDH_STATUS ist ein Zeiger auf eine DH_STATUS struct, so dass Sie brauchen, um zu definieren, eine C# - Struktur zu entsprechen.
Check-out P/Invoke.Net einige Beispiele zur Verwendung von p/invoke auf die Windows-standard-Header, Strukturen und Funktionen. Die website ist eine Art von klunky, man muss nur halten Sie und der Erweiterung Elemente in der linken Spalte.
P/Invoke ist nicht gut dokumentiert, aber sobald Sie die Karte der Struktur und der extern-Funktion aufrufen, Sie sollten im Geschäft sein.