GetProcAddress
Processos explicitamente vinculando a uma chamada DLL GetProcAddress para obter o endereço de uma função exportada na DLL. Você pode usar o ponteiro de função retornado para chamar a função DLL. GetProcAddress utiliza como parâmetros a alça do módulo DLL (retornado por um LoadLibrary, AfxLoadLibrary, ou GetModuleHandle) e leva o nome da função que você deseja que a chamada ou exportação da função ordinal.
Como 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 de ajudar a fornecer a segurança de tipos é examinar os protótipos de função das funções exportadas e criar definições de tipo correspondentes dos ponteiros de função. For example:
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 você especificar a função desejada ao chamar GetProcAddress depende de como a DLL foi criada.
Você só pode obter o ordinal de exportação se você estiver vinculando a DLL baseia-se com um arquivo de definição (. def) do módulo e os ordinais são listados com as funções no 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 os ordinais de exportação servem como índices, a dll exportar a tabela. Com um ordinal de exportação, GetProcAddress pode localizar a função diretamente, em oposição ao 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ê tem controle sobre a atribuição de números ordinais para as funções exportadas no arquivo. def.