我有一个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 *参数的警告。 返回的字符串现在看起来很好,但是包含了null字符终止符,所以如果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。
答案 0 :(得分:0)
char
与integer
相同。在VBA中,这意味着long
(因为VBA使用16位术语)。没有涉及的字符串。要将整数或字符串转换为字符串,请使用chr(x)
。