Partilhar via


Chamando funções DLL de aplicativos Visual Basic

Para aplicativos Visual Basic (ou aplicativos em outras linguagens, como Pascal ou Fortran) para chamar funções em uma DLL C/C++, as funções devem ser exportadas usando a convenção de chamada correta sem qualquer decoração de nome feita pelo compilador

__stdcall Cria a convenção de chamada correta para a função (a função chamada limpa a pilha e os parâmetros são passados da direita para a esquerda), mas decora o nome da função de forma diferente. Assim, quando __declspec(dllexport) é usado em uma função exportada em uma DLL, o nome decorado é exportado.

A __stdcall decoração do nome prefixa o nome do símbolo com um sublinhado (_) e acrescenta ao símbolo um sinal arroba (@) seguido pelo número de bytes na lista de argumentos (o espaço de pilha necessário). Como resultado, a função quando declarada como:

int __stdcall func (int a, double b)

é decorado como _func@12 na saída.

A convenção de chamada C (__cdecl) decora o nome como _func.

Para obter o nome decorado, use /MAP. O uso de __declspec(dllexport) faz o seguinte:

  • Se a função for exportada com a convenção de chamada C (__cdecl), ela retirará o sublinhado à esquerda ( _ ) quando o nome for exportado.

  • Se a função que está sendo exportada não usar a convenção de chamada C (por exemplo, __stdcall), ela exportará o nome decorado.

Como não há forma de alterar onde a limpeza de pilha ocorre, deve-se usar __stdcall. Para desdecorar nomes com __stdcall, você deve especificá-los usando aliases na seção EXPORTS do arquivo .def. Isso é mostrado da seguinte forma para a seguinte declaração de função:

int  __stdcall MyFunc (int a, double b);
void __stdcall InitCode (void);

No arquivo .DEF:

EXPORTS
   MYFUNC=_MyFunc@12
   INITCODE=_InitCode@0

Para que as DLLs sejam chamadas por programas escritos em Visual Basic, a técnica de alias mostrada neste tópico é necessária no arquivo .def. Se o alias é feito no programa Visual Basic, o uso de aliasing no arquivo .def não é necessário. Isso pode ser feito no programa Visual Basic adicionando uma cláusula alias à instrução Declare .

Sobre o que quer saber mais?

Ver também

criar DLLs C/C++ no Visual Studio