Partilhar via


GetProcAddress

Processa explicitamente vinculando a uma chamada DLL GetProcAddress para obter o endereço de uma função exportada na DLL. Para chamar a função DLL, utiliza o ponteiro de função retornado. GetProcAddress toma como parâmetros o identificador do módulo DLL (retornado por LoadLibraryAfxLoadLibrary ou GetModuleHandle) e leva o nome da função que você deseja chamar ou o ordinal de exportação da função.

Como a função DLL está a ser chamada por meio de um ponteiro e não há verificação de tipo em tempo de compilação, certifique-se de que os parâmetros da função estão corretos para evitar 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 das funções exportadas e criar typedefs 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 você especifica a função que você deseja ao chamar GetProcAddress depende de como a DLL foi criada.

Você só pode 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, em oposição ao nome da função, é um pouco mais rápido se a DLL tiver muitas funções exportadas porque os ordinais de exportação servem como índices na 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.

O que pretende fazer?

Sobre o que quer saber mais?

Ver também

criar DLLs C/C++ no Visual Studio