尝试从VBA(MS Access)调用C ++ DLL并不断出现“错误的dll调用约定”错误,以及MS Access崩溃。
这是我要调用的C ++ API函数:
_IMPORT HRESULT _CONVENTION PCRSNewTrip (Trip *pTripID);
“旅行”的定义为:
typedef long Trip;
通过API标头:
#if defined (__BORLANDC__)
#define _IMPORT __declspec( dllimport )
#define _CONVENTION __stdcall
#elif defined (_MSC_VER)
#define _IMPORT _declspec( dllimport )
#define _CONVENTION _cdecl
#endif
有关此功能的一些信息: PCRSNewTrip()将新行程的句柄放置在传入的(tripID)的指针参数中。返回代码与所有其他DLL函数(用于错误处理)相同。
这是我最近一次调用该函数的尝试:
Public Declare Function PCRSNewTrip Lib "C:\xxx\pcrsrv32.dll" Alias "_PCRSNewTrip" (ByRef myTripPtr As Long) As Long
Private Sub NewTrip_Click()
Dim myTrip As Long
Dim myTripPtr As Long
myTripPtr = VarPtr(myTrip)
myTrip = PCRSNewTrip(myTripPtr)
EndSub
我收到“错误的DLL调用约定”错误。
答案 0 :(得分:1)
猜测这是条件编译标头代码的“实时”分支:
#elif defined (_MSC_VER)
#define _IMPORT _declspec( dllimport )
#define _CONVENTION _cdecl
#endif
Windows上的VBA不支持 _cdecl
。您需要使用使用__stdcall
的DLL构建。