Delen via


Procedure: Systeemeigen DLL's aanroepen vanuit beheerde code met behulp van PInvoke

Functies die zijn geïmplementeerd in niet-beheerde DLL's, kunnen worden aangeroepen vanuit beheerde code met behulp van de functionaliteit Platform Invoke (P/Invoke). Als de broncode voor het DLL-bestand niet beschikbaar is, is P/Invoke de enige optie voor samenwerking. In tegenstelling tot andere .NET-talen biedt Visual C++ echter een alternatief voor P/Invoke. Zie C++ Interop (impliciete PInvoke) gebruiken voor meer informatie.

Voorbeeld

In het volgende codevoorbeeld wordt de functie Win32 GetSystemMetrics gebruikt om de huidige resolutie van het scherm op te halen in pixels.

Voor functies die alleen intrinsieke typen als argumenten en retourwaarden gebruiken, is er geen extra werk vereist. Voor andere gegevenstypen, zoals functiepointers, matrices en structuren, zijn extra kenmerken vereist om de juiste gegevens marshaling te garanderen.

Hoewel het niet vereist is, is het raadzaam om statische leden van een waardeklasse P/Invoke-declaraties te maken, zodat ze niet bestaan in de globale naamruimte, zoals in dit voorbeeld wordt gedemonstreerd.

// 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);
}

Zie ook

Expliciet gebruik maken van PInvoke in C++ (DllImport-kenmerk)