Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 无法将字符串从vba传递到windows dll_String_Windows_Vba_Dll_Parameters - Fatal编程技术网

String 无法将字符串从vba传递到windows dll

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,

我有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, 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
,则库不需要转换任何内容。a
BSTR
已经是有效的
LPCWSTR
。因此VBA要么不传递
BSTR
,要么封送员做了我不知道的事情。