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)