我有一个DLL,它的函数声明如下:
char * __declspec(dllexport) WINAPI test(int x);
我想在Access VBA中这样调用它:
Private Declare Function "test" Lib "MyDLL.dll"(ByVal x As Long) As String
Sub MySub
Dim s As String
s = test(1)
End Sub
根据在Google中找到的文章,我在DLL中编写了一个函数:
BSTR CStrToVBStr(char *str)
{
int wslen = MultiByteToWideChar(CP_ACP, 0, str, lstrlen(str), 0, 0);
BSTR bstr = SysAllocStringLen(0, wslen);
MultiByteToWideChar(CP_ACP, 0, str, strlen(str), bstr, wslen);
return bstr;
}
在调用test()之后,s显然包含Unicode字符。也就是说,将char * "test“返回给VBA,使Mid(s,1,1) = "t",Mid(s,2,1) = Chr(0),Mid(s,3,1) = "e",等等。我决定跳过到Unicode的转换,并将CstrToVBStr写为
BSTR CStrToVBStr(char *str)
{
return SysAllocString(str);
}
并忽略了SysAllocString接受OLECHAR *而不是char *参数的警告。返回的字符串现在看起来不错,但是包含了空字符终止符,所以如果char *是"test",那么在VBA中len(s) =5,Right(s,1) = Chr(0)。
做我正在做的事情,正确的方法是什么?我看到的所有示例都是将char *作为参数,而不是返回值。我可以将test()更改为
void __declspec(dllexport) WINAPI test(int x, char *result);
但我想知道我正在尝试做的事情是否可能。
我在Windows 7(64位)上使用Access 2007。
发布于 2015-01-14 11:18:46
char
与integer
相同。在VBA中,这意味着long
(因为VBA使用16位术语)。不涉及任何字符串。要将整数或字符转换为字符串,请使用chr(x)
。
https://stackoverflow.com/questions/27940971
复制