String 无法将字符串从vba传递到windows dll
我有64位windows 10和MS Office 64位。我正在尝试让VBA for PowerPoint在自行编写的64位windows DLL中加载和执行函数 问题是我无法将字符串从VBA传递到Windows DLL。在各种网站上有很多讨论,但我没有找到一个有效的。 我尝试了两种方法,但都没有成功。如果我使用一个叫DLL的C++应用程序,我没有问题。 方法1: 动态链接库:String 无法将字符串从vba传递到windows dll,string,windows,vba,dll,parameters,String,Windows,Vba,Dll,Parameters,我有64位windows 10和MS Office 64位。我正在尝试让VBA for PowerPoint在自行编写的64位windows DLL中加载和执行函数 问题是我无法将字符串从VBA传递到Windows DLL。在各种网站上有很多讨论,但我没有找到一个有效的。 我尝试了两种方法,但都没有成功。如果我使用一个叫DLL的C++应用程序,我没有问题。 方法1: 动态链接库: extern "C" { __declspec(dllexport) long jaadd(long a,
extern "C" {
__declspec(dllexport) long jaadd(long a, long b, LPCWSTR strg)
{
MessageBoxW(NULL, strg, L"DLL", MB_OK);
return a+b;
}
}
extern "C" {
__declspec(dllexport) long jaadd(long a, long b, LPCSTR strg)
{
MessageBoxA(NULL, strg, "DLL", MB_OK);
return a+b;
}
}
在VBA中:
Private Declare PtrSafe Function jaadd Lib "D:\\Visual Studio 2017\\Projects\\PopUpDLL\\x64\\Debug\\PopUpDLL.dll" _
(ByVal arg1 As Long, ByVal arg2 As Long, ByVal lParam As String) As Long
y = jaadd(1, 2, "abcdxxxxx")
结果:
y=3,这是正确的,但消息框显示象形文字
方法2-不使用宽字符串:
动态链接库:
extern "C" {
__declspec(dllexport) long jaadd(long a, long b, LPCWSTR strg)
{
MessageBoxW(NULL, strg, L"DLL", MB_OK);
return a+b;
}
}
extern "C" {
__declspec(dllexport) long jaadd(long a, long b, LPCSTR strg)
{
MessageBoxA(NULL, strg, "DLL", MB_OK);
return a+b;
}
}
VBA是相同的
结果:
y=3,这是正确的,但消息框显示“无”
所有帮助均已收到。谢谢您的帮助。这与VBA处理字符串的方式有关。我似乎已经解决了这个问题。如果我有:
__declspec(dllexport) long jastr(long a, LPCWSTR strg)
那么在VBA中我有
Private Declare PtrSafe Function jastr Lib "<DLL Path>" _
(ByVal arg1 As Long, ByVal arg2 As LongPtr) As Long
DLL中的messagebox输出hellothere和y是正确的。
我推荐下面的链接,这是一个很大的帮助:
但是我仍然面临着jaadd有三个或更多长参数的问题。VBA中的字符串是
BSTR
。可能是空终止符把事情搞砸了。@Mat'sMug:'s是以零结尾的,就像任何其他C样式的字符串一样。指针还指向第一个字符(不是长度前缀)。即使LPCWSTR
是错误的类型,但如果它通过了BSTR
,那么它仍然可以安全地用作参数@Jonnanthony:您可以发布通过strg
传递的缓冲区的内容吗(开始时比指针低4个字节)?不确定这在VBA中是否合法,但您可能必须具体说明封送,即lParam As String
@Mat'sMug:MarshalAs
属性是P/Invoke声明的一部分,与C中相同。VBA也不需要知道什么是LPCWSTR
。如果它通过<代码> BSTR ,C++代码应该是很好的,即使它不是严格使用正确的类型。@ Mat'SMug:微软的C++编译器也使用32位宽<代码>长< /Cord> s(参见),因此没有立即附加的问题。(添加n位数字并将结果存储在n位数字中,在所有可能的情况下,仍有50%会溢出)。至于字符串类型:如果VBA实际上传递了BSTR
,则库不需要转换任何内容。aBSTR
已经是有效的LPCWSTR
。因此VBA要么不传递BSTR
,要么封送员做了我不知道的事情。