Sdílet prostřednictvím


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

Funkce, které jsou implementovány v nespravovaných knihovnách DLL lze volat ze spravovaného kódu pomocí funkce volání nespravovaného kódu (P/Invoke). Pokud není k dispozici zdrojový kód pro knihovnu DLL, P/Invoke je jedinou možností pro spolupráci. Nicméně na rozdíl od jiných jazyků .NET, Visual C++ poskytuje alternativu k P/Invoke. Další informace naleznete v tématu Použití interoperability C++ (implicitně 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é používají pouze vnitřních typů jako argumenty a vrácené hodnoty, žádná další činnost není požadována. Ostatní datové typy, jako jsou například ukazatele na funkce, pole a struktury, vyžadují další atributy, které zajistí řádné zařazování dat.

Ačkoli to není požadováno, je vhodné P/Invoke (voláním nespravovaného kódu) deklarovat statické členy třídy hodnot tak, že neexistují v globálním oboru názvů, jak je ukázá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é

Další zdroje

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