我有64位Windows 10和MS Office 64位。我试图让PowerPoint的VBA加载并执行自编写的64位Windows DLL中的函数。
我遇到的问题是我得到一个例外 - 我认为是由于堆栈处理。 dll包含(在def文件中完成的导出):
void _stdcall jastrNR(LPCWSTR strg1, LPCWSTR strg2, LPCWSTR strg3, LPCWSTR strg4)
VBA包含:
Private Declare PtrSafe Sub jastrNR Lib "<DLL path>" (ByVal arg1 As LongPtr, ByVal arg2 As LongPtr, ByVal arg3 As LongPtr, ByVal arg4 As LongPtr)
Sub Play1()
Dim s1 As String
Dim p1 As LongPtr
Dim y As Long
y = 0
MsgBox y
s1 = "123abc"
p1 = StrPtr(s1)
jastrNR p1, p1, p1, p1
p4 = StrPtr(s4)
MsgBox y *** here I get exception or "invalid procedure call or argument" message
End Sub
如果我在DLL中打印出测试字符串,我确实看到了正确的数据,即123abc 如果参数很长,整数,则没有问题。 如果我让jastrNR返回很长时间也没有问题。 我也尝试匹配C ++中的参数:
void _stdcall jastrNR(LONG_PTR strg1, LONG_PTR strg2, LONG_PTR strg3, LONG_PTR strg4)
我得到了同样的例外。
在Visual Studio 2017中,我已将(在C ++设置下)设置调用约定为__stdcall(/ Gz)。 我在链接器映射输出中注意到了:
?jastrNR@@YAX_J000@Z (void __cdecl jastrNR(__int64,__int64,__int64,__int64))
exported name: jastrNR
__cdecl关心我,因为我认为我应该看到__stdcall
感激不尽的任何帮助。