Chamando funções DLL a partir de aplicativos Visual Basic
Para aplicativos Visual Basic (ou aplicativos em outras linguagens como Pascal ou Fortran) chamarem funções em uma DLL C/C++, as funções deverão ser exportadas usando a convenção de chamada correta sem decorações de nome feitas 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. Portanto, quando __declspec(dllexport)
for usado em uma função exportada em uma DLL, o nome decorado será exportado.
A decoração de nome __stdcall
prefixa o nome do símbolo com um sublinhado ( _ ) e anexa o símbolo com um caractere de 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)
é decorada 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 removerá o sublinhado inicial ( _ ) quando o nome for exportado.Se a função sendo exportada não usar a convenção de chamada C (por exemplo,
__stdcall
), ela exportará o nome decorado.
Como não é possível substituir o local de limpeza da pilha, será necessário usar __stdcall
. Para remover a decoração de nomes com __stdcall
, será necessário 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 por programas escritos em Visual Basic, a técnica de alias mostrada neste tópico será necessária no arquivo .def. Se o alias for feito no programa Visual Basic, não será necessário usar alias no arquivo .def. É possível fazer isso no programa Visual Basic adicionando uma cláusula de alias à instrução Declarar.