GetProcAddress
Elabora il collegamento esplicito a una chiamata DLL GetProcAddress per ottenere l'indirizzo di una funzione esportata nella DLL. Usare il puntatore di funzione restituito per chiamare la funzione DLL. GetProcAddress accetta come parametri l'handle del modulo DLL (restituito da LoadLibrary, AfxLoadLibrary
o GetModuleHandle) e accetta il nome della funzione che si vuole chiamare o l'ordinale di esportazione della funzione.
Poiché si chiama la funzione DLL tramite un puntatore e non è presente alcun controllo dei tipi in fase di compilazione, assicurarsi che i parametri per la funzione siano corretti in modo da non eseguire il passaggio eccessivo della memoria allocata nello stack e causare una violazione di accesso. Un modo per garantire la sicurezza dei tipi consiste nell'esaminare i prototipi di funzione delle funzioni esportate e creare typedef corrispondenti per i puntatori a funzione. Ad esempio:
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);
}
}
Il modo in cui si specifica la funzione desiderata quando si chiama GetProcAddress dipende dalla modalità di compilazione della DLL.
È possibile ottenere l'ordinale di esportazione solo se la DLL a cui si esegue il collegamento viene compilata con un file di definizione del modulo (def) e se i ordinali sono elencati con le funzioni nella sezione EXPORT del file con estensione def della DLL. La chiamata a GetProcAddress con un ordinale di esportazione, anziché il nome della funzione, è leggermente più veloce se la DLL ha molte funzioni esportate perché gli ordinali di esportazione fungono da indici nella tabella di esportazione della DLL. Con un ordinale di esportazione, GetProcAddress può individuare direttamente la funzione anziché confrontare il nome specificato con i nomi delle funzioni nella tabella di esportazione della DLL. Tuttavia, è necessario chiamare GetProcAddress con un ordinale di esportazione solo se si ha il controllo sull'assegnazione dei ordinali alle funzioni esportate nel file con estensione def.