Compartir a través de


Uso de Run-Time vinculación dinámica

Puede usar el mismo archivo DLL en la vinculación dinámica en tiempo de carga y en tiempo de ejecución. En el ejemplo siguiente se usa la función LoadLibrary para obtener un identificador para el archivo DLL de Myputs (consulte Creating a Simple Dynamic-Link Library). Si LoadLibrary se realiza correctamente, el programa usa el identificador devuelto en la función GetProcAddress para obtener la dirección de la función myPuts del archivo DLL. Después de llamar a la función DLL, el programa llama a la función FreeLibrary para descargar el archivo DLL.

Dado que el programa usa la vinculación dinámica en tiempo de ejecución, no es necesario vincular el módulo con una biblioteca de importación para el archivo DLL.

En este ejemplo se muestra una diferencia importante entre la vinculación dinámica en tiempo de ejecución y el tiempo de carga. Si el archivo DLL no está disponible, la aplicación que usa la vinculación dinámica en tiempo de carga simplemente debe finalizar. Sin embargo, el ejemplo de vinculación dinámica en tiempo de ejecución puede responder al error.

// A simple program that uses LoadLibrary and 
// GetProcAddress to access myPuts from Myputs.dll. 
 
#include <windows.h> 
#include <stdio.h> 
 
typedef int (__cdecl *MYPROC)(LPCWSTR); 
 
int main( void ) 
{ 
    HINSTANCE hinstLib; 
    MYPROC ProcAdd; 
    BOOL fFreeResult, fRunTimeLinkSuccess = FALSE; 
 
    // Get a handle to the DLL module.
 
    hinstLib = LoadLibrary(TEXT("MyPuts.dll")); 
 
    // If the handle is valid, try to get the function address.
 
    if (hinstLib != NULL) 
    { 
        ProcAdd = (MYPROC) GetProcAddress(hinstLib, "myPuts"); 
 
        // If the function address is valid, call the function.
 
        if (NULL != ProcAdd) 
        {
            fRunTimeLinkSuccess = TRUE;
            (ProcAdd) (L"Message sent to the DLL function\n"); 
        }
        // Free the DLL module.
 
        fFreeResult = FreeLibrary(hinstLib); 
    } 

    // If unable to call the DLL function, use an alternative.
    if (! fRunTimeLinkSuccess) 
        printf("Message printed from executable\n"); 

    return 0;

}

Vinculación dinámica en tiempo de ejecución