将参数从VBA传递到WIndows DLL时无效的过程调用或参数

时间:2017-04-20 20:14:09

标签: c++ vba dll visual-studio-2017 invalid-argument

我有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

感激不尽的任何帮助。

0 个答案:

没有答案