É a primeira vez que escrevo DLLs e, como o título sugere, estou tentando importar minha DLL no Excel, mas me deparei com uma parede de tijolos com stdcall escrito nela. Aqui está um exemplo mínimo do meu problema: Minha DLL C++ define as funções
extern "C" __declspec(dllexport) BOOL testBool1() {
return true;
}
extern "C" __declspec(dllexport) BOOL __stdcall testBool2() {
return true;
}
extern "C" __declspec(dllexport) BOOL __stdcall testBool3(BOOL a) {
return a;
}
extern "C" __declspec(dllexport) BOOL testBool4(BOOL a) {
return a;
}
no VBA eu tento importá-los usando
Declare Function testBool1 Lib "MyDLL" () As Boolean
Declare Function testBool2 Lib "MyDLL" () As Boolean
Declare Function testBool3 Lib "MyDLL" (ByVal a As Boolean) As Boolean
Declare Function testBool4 Lib "MyDLL" (ByVal a As Boolean) As Boolean
Sub Test()
testBool1
testBool2
testBool3 (True)
testBool4 (True)
End Sub
- testBool1 funciona perfeitamente
- testBool2 dá um erro 453 (Não é possível encontrar o ponto de entrada da DLL)
- testBool3 dá um erro 49 (Convenção de chamada de DLL incorreta)
- testBool4 dá um erro 453 (Não é possível encontrar o ponto de entrada da DLL)
O que eu acho que está acontecendo é:
- O Excel espera a convenção stdcall. No entanto, se a função não tiver parâmetros, não importa se é stdcall ou cdecl, portanto testBool1 funciona e testBool3 não.
- Colocar __stdcall em C++ impede que o VBA encontre a função, daí o erro 453 para testBool2 e testBool4.
O que posso fazer para consertar isso? No meu problema, não consigo alterar o código VBA, apenas o código C++.
Atualização: parece que o compilador c++ está adicionando um '_' às funções com __stdcall, a DLL contém ".testBool1._testBool2@ [email protected] ". Isso só acontece ao compilar para uma DLL de 32 bits. Com uma DLL de 64 bits não deve haver problema, infelizmente não tenho um Excel de 64 bits agora para verificar.