Dela via


Anvisningar: Anropa interna DLL:er från hanterad kod med hjälp av PInvoke

Funktioner som implementeras i ohanterade DLL:er kan anropas från hanterad kod med hjälp av P/Invoke-funktioner (Platform Invoke). Om källkoden för DLL inte är tillgänglig är P/Invoke det enda alternativet för samverkan. Men till skillnad från andra .NET-språk är Visual C++ ett alternativ till P/Invoke. Mer information finns i Använda C++ Interop (Implicit PInvoke).

Exempel

I följande kodexempel används funktionen Win32 GetSystemMetrics för att hämta skärmens aktuella upplösning i bildpunkter.

För funktioner som endast använder inbyggda typer som argument och returvärden krävs inget extra arbete. Andra datatyper, till exempel funktionspekare, matriser och strukturer, kräver ytterligare attribut för att säkerställa korrekt datamarsering.

Även om det inte krävs är det bra att göra P/Invoke-deklarationer statiska medlemmar i en värdeklass så att de inte finns i det globala namnområdet, vilket visas i det här exemplet.

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

Se även

Använda explicit PInvoke i C++ (DllImport-attribut)