GetProcAddress

Actualización: noviembre 2007

Los procesos que se vinculan explícitamente a un archivo DLL llaman a GetProcAddress para obtener la dirección de una función exportada del archivo DLL. Debe utilizar el puntero a la función devuelto para llamar a la función del archivo DLL. GetProcAddress toma como parámetros el identificador de módulo del archivo DLL (devuelto por LoadLibrary, AfxLoadLibrary o GetModuleHandle) y toma el nombre de la función a la que se desea llamar o el ordinal de exportación de la función.

Como está llamando a la función DLL mediante un puntero y no hay comprobación de tipos en tiempo de compilación, debe asegurarse de que los parámetros pasados a la función son correctos, para no sobrepasar la memoria asignada en la pila y causar así una infracción de acceso. Una forma de contribuir a la seguridad de tipos es consultar los prototipos de función de las funciones exportadas y crear definiciones typedef coincidentes para los punteros de función. Por ejemplo:

typedef UINT (CALLBACK* LPFNDLLFUNC1)(DWORD,UINT);
...

HINSTANCE hDLL;               // Handle to DLL
LPFNDLLFUNC1 lpfnDllFunc1;    // Function pointer
DWORD dwParam1;
UINT  uParam2, uReturnVal;

hDLL = LoadLibrary("MyDLL");
if (hDLL != NULL)
{
   lpfnDllFunc1 = (LPFNDLLFUNC1)GetProcAddress(hDLL,
                                           "DLLFunc1");
   if (!lpfnDllFunc1)
   {
      // handle the error
      FreeLibrary(hDLL);
      return SOME_ERROR_CODE;
   }
   else
   {
      // call the function
      uReturnVal = lpfnDllFunc1(dwParam1, uParam2);
   }
}

La forma de especificar la función que desea al llamar a GetProcAddress dependerá de cómo se generó el archivo DLL.

Sólo podrá obtener el ordinal de exportación si el archivo DLL al que se está vinculando se ha creado con un archivo de definición de módulos (.def) y si los ordinales figuran en la lista de funciones de la sección EXPORTS del archivo .def correspondiente al archivo DLL. Utilizar un ordinal de exportación en lugar de un nombre de función para llamar a GetProcAddress resulta un poco más rápido si el archivo DLL tiene muchas funciones exportadas, puesto que los ordinales exportados sirven como índices en la tabla de exportación del archivo DLL. Con un ordinal de exportación, GetProcAddress puede encontrar la función directamente, sin tener que comparar el nombre especificado con los nombres de función de la tabla de exportación del archivo DLL. Sin embargo, sólo se debe llamar a GetProcAddress con un ordinal de exportación si se dispone de control sobre la asignación de ordinales a las funciones exportadas en el archivo .def.

¿Qué desea hacer?

¿Qué más desea saber?

Vea también

Conceptos

Archivos DLL