Partilhar via


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.

O que você deseja fazer?

O que você deseja saber mais sobre?

Consulte também

Conceitos

DLLs no Visual C++