Compartir a través de


Cómo: Llamar a archivos DLL nativos desde el código administrado mediante PInvoke

Las funciones que se implementan en archivos DLL no administrados se pueden llamar desde código administrado mediante la funcionalidad de invocación de plataforma (P/Invoke). Si el código fuente del archivo DLL no está disponible, P/Invoke es la única opción para interoperar. Pero a diferencia de otros lenguajes .NET, Visual C++ proporciona una alternativa a P/Invoke. Para más información, consulte Uso de la interoperabilidad de C++ (PInvoke implícito).

Ejemplo

En el ejemplo de código siguiente se usa la función GetSystemMetrics de Win32 para recuperar la resolución actual de la pantalla en píxeles.

Para las funciones que solo usan tipos intrínsecos como argumentos y valores devueltos, no se requiere ningún trabajo adicional. Otros tipos de datos, como punteros de función, matrices y estructuras, requieren atributos adicionales para garantizar la serialización de datos adecuada.

Aunque no es necesario, se recomienda hacer que las declaraciones P/Invoke sean miembros estáticos de una clase de valor para que no existan en el espacio de nombres global, como se muestra en este ejemplo.

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

Consulte también

Usar un elemento PInvoke explícito en C++ (Atributo DllImport)