Compartilhar via


Chamando funções DLL a partir de aplicativos Visual Basic

Para aplicativos Visual Basic (ou aplicativos em outros idiomas como Pascal ou Fortran) chamarem funções no C/C++ DLL, as funções devem ser exportadas usando a convenção correta de chamada sem nenhuma decoração de nome feita pelo compilador.

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

A decoração de nome __stdcall prefixa o nome do símbolo com um sublinhado (_) e acrescenta o símbolo com um caractere da 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

A convenção de chamada do 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 tira o sublinhado (_) principal quando o nome é exportado.

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

Como não há nenhuma maneira de substituir onde a limpeza de pilha ocorre, você deve usar __stdcall. Para os nomes não decorados com __stdcall, você deve especificá-los usando aliases na seção de EXPORTAÇÕES do arquivo .def. Isso será mostrado a seguir 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 pelos programas escritos no Visual Basic, a técnica do alias exibida neste tópico é necessária no arquivo .def. Se o alias for feito no programa Visual Basic, o uso de serrilhado no arquivo .def não será necessário. Pode ser feito no programa Visual Basic, adicionando uma cláusula alias para a declaração Declarar.

Que você deseja saber mais?

Consulte também

Conceitos

DLLs no Visual C++