GetProcAddress
Processos que se vinculam explicitamente a uma chamada DLL GetProcAddress para obter o endereço de uma função exportada na DLL. Use o ponteiro de função retornado para chamar a função DLL. GetProcAddress usa como parâmetros o identificador do módulo DLL (retornado por LoadLibraryAfxLoadLibrary
ou GetModuleHandle) e usa o nome da função que você deseja chamar ou o ordinal de exportação da função.
Como você está chamando a função DLL por meio de um ponteiro e não há verificação de tipo de tempo de compilação, verifique se os parâmetros para a função estão corretos para não ultrapassar a memória alocada na pilha e causar uma violação de acesso. Uma maneira de ajudar a fornecer segurança de tipo é examinar os protótipos de função das funções exportadas e criar typedefs correspondentes aos ponteiros da função. Por exemplo:
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);
}
}
A forma como você especifica a função desejada ao chamar GetProcAddress depende de como a DLL foi criada.
Você só poderá obter o ordinal de exportação se a DLL à qual você está vinculando for criada com um arquivo de definição de módulo (.def) e se os ordinais estiverem listados com as funções na seção EXPORTS do arquivo .def da DLL. Chamar GetProcAddress com um ordinal de exportação, ao contrário do nome da função, será um pouco mais rápido se a DLL tiver muitas funções exportadas porque os ordinais de exportação servem como índices para a tabela de exportação da DLL. Com um ordinal de exportação, GetProcAddress pode localizar a função diretamente em vez de comparar o nome especificado com os nomes de função na tabela de exportação da DLL. No entanto, você deve chamar GetProcAddress com um ordinal de exportação somente se tiver controle sobre a atribuição dos ordinais às funções exportadas no arquivo .def.