我已尝试过这里发布的技巧(至少是我发现的技巧),但我似乎仍然无法摆脱可怕的“Bad DLL Calling Convention”错误。这是我的(非常简单的)c ++代码:
VRTTCONVERSION_API long controlVTT(BYTE controlVal, BYTE valueVal)
{
LPSTR controlStr = new char[256];
PCHAR convstrout = new char[256];
if (controlVal == 1) {
controlStr = "Ping";
}else if (controlVal == 2) {
controlStr = "0 Init Tool Default";
}
if (bGetGeneralAccessFunctionPointer()) {
return (pGeneral)(controlStr, convstrout, 256);
}
else {
printf("failed to acquire function pointer.\n");
return -1;
}
}
这应该接受字节作为输入并返回一个长整数。我知道返回有效,因为我有另一个函数不接受任何输入并返回long并且一个工作正常。
这是VBA代码(再次,简单):
Public Declare PtrSafe Function controlVTT Lib "VRTTConversionDLL.dll" Alias "#4" (ByVal controlVal As Byte, ByVal valueVal As Byte) As Long
Sub testControl()
Dim retval As Long
Dim bFunc As Byte
Dim bVal As Byte
bVal = 0
bFunc = 1
retval = controlVTT(bFunc, bVal)
MsgBox retval
bFunc = 2
retval = controlVTT(bFunc, bVal)
MsgBox retval
End Sub
我知道#4别名是正确的(使用DLL导出查看器)。当我从另一个C ++函数调用它时,该函数也有效(见下文):
int main()
{
long retVal;
retVal = controlVTT(1, 0);
printf("Return: %08X \n", retVal);
retVal = controlVTT(2, 0);
printf("Return: %08X \n", retVal);
return 0; return 0;
}
显然,我不是一名专业的程序员,我可能会遗漏一些基本的东西,但我真的被卡住了。