Sdílet prostřednictvím


Postupy: Volání nativních knihoven DLL ze spravovaného kódu pomocí služby PInvoke

Funkce implementované v nespravovaných knihovnách DLL je možné volat ze spravovaného kódu pomocí funkce Volání platformy (P/Invoke). Pokud zdrojový kód pro knihovnu DLL není k dispozici, je jediným parametrem pro spolupráci volání nespravovaného kódu. Na rozdíl od jiných jazyků .NET ale Visual C++ nabízí alternativu k volání nespravovaného kódu. Další informace naleznete v tématu Použití Zprostředkovatele komunikace C++ (Implicit PInvoke).

Příklad

Následující příklad kódu používá funkci Win32 GetSystemMetrics k načtení aktuálního rozlišení obrazovky v pixelech.

Pro funkce, které jako argumenty používají pouze vnitřní typy a návratové hodnoty, není nutná žádná další práce. Jiné datové typy, jako jsou ukazatele na funkce, pole a struktury, vyžadují další atributy, aby se zajistilo správné zařazování dat.

I když to není povinné, je vhodné vytvořit deklarace P/Invoke statické členy třídy hodnot, aby v globálním oboru názvů neexistují, jak je znázorněno v tomto příkladu.

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

Viz také

Použití explicitního volání PInvoke v jazyce C++ (atribut DllImport)