GetProcAddress
Processos explicitamente vinculando 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 pelo LoadLibrary, AfxLoadLibrary, ou GetModuleHandle) e leva o nome da função que você deseja que a chamada ou exportação da função ordinal.
Porque você está chamando a função DLL através de um ponteiro e não há nenhuma verificação de tipo de tempo de compilação, certifique-se de que os parâmetros para a função estão corretos para que você não overstep a memória alocada na pilha e causar uma violação de acesso.Uma maneira para ajudar a fornecer segurança de tipos é examinar os protótipos de função das funções exportadas e criar definições de tipo correspondentes para os ponteiros de 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);
}
}
Como especificar a função desejada ao chamar GetProcAddress depende de como a DLL foi criada.
Você pode obter apenas o ordinal de exportação se estiver vinculando a DLL é criado com um arquivo de definição (. def) do módulo e os ordinais são listados com as funções de exportações seção do arquivo. def da DLL.Chamando GetProcAddress com uma exportação ordinal, em oposição a nome da função, é ligeiramente mais rápido se a DLL tem muitas funções exportadas porque ordinais exportação servem como índices a dll exportar tabela.Com um ordinal de exportação GetProcAddress pode localizar a função diretamente em vez de comparar o nome especificado para 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 você tiver controle sobre a atribuição de ordinais para as funções exportadas no arquivo. def.