Gewusst wie: Aufrufen von systemeigenen DLLs in verwaltetem Code mithilfe von PInvoke

Aktualisiert: November 2007

Funktionen, die in nicht verwalteten DLLs implementiert sind, können von verwaltetem Code über Plattformaufrufe (P/Invoke) aufgerufen werden. Wenn der Quellcode für die DLL nicht verfügbar ist, ist P/Invoke die einzige Option für die Interoperation. Im Gegensatz zu anderen .NET-Sprachen stellt Visual C++ jedoch eine Alternative zu P/Invoke bereit. Weitere Informationen finden Sie unter Verwenden von C++-Interop (implizites PInvoke).

Beispiel

Im folgenden Codebeispiel wird mit der GetSystemMetrics-Funktion von Win32 die aktuelle Auflösung des Bildschirms in Pixel abgerufen.

Bei Funktionen, die als Argumente und Rückgabewerte nur systeminterne Typen verwenden, müssen keine weiteren Aufgaben durchgeführt werden. Für andere Datentypen wie Funktionszeiger, Arrays und Strukturen sind weitere Attribute erforderlich, um ein ordnungsgemäßes Datenmarshalling sicher zu stellen.

Obwohl dies nicht erforderlich ist, stellt es eine gute Übung dar, die P/Invoke-Deklarationen als statische Member einer Werteklasse zu erstellen. Wie im folgenden Beispiel dargestellt, sind die Deklarationen auf diese Weise nicht im globalen Namespace vorhanden.

// pinvoke_basic.cpp
// compile with: /clr
using namespace System;
using namespace System::Runtime::InteropServices;

value class Win32 {
public:
   [DllImport("User32.dll")]
   static int GetSystemMetrics(int);

   enum class SystemMetricIndex {
      // Same values as those defined in winuser.h.
      SM_CXSCREEN = 0,
      SM_CYSCREEN = 1
   };
};

int main() {
   int hRes = Win32::GetSystemMetrics( safe_cast<int>(Win32::SystemMetricIndex::SM_CXSCREEN) );
   int vRes = Win32::GetSystemMetrics( safe_cast<int>(Win32::SystemMetricIndex::SM_CYSCREEN) );
   Console::WriteLine("screen resolution: {0},{1}", hRes, vRes);
}

Siehe auch

Weitere Ressourcen

Verwenden von explizitem PInvoke in C++ (DllImport-Attribut)