在DLL中调用C函数,从MS-Access VBA返回char *

时间:2015-01-14 10:40:13

标签: vba dll access-vba

我有一个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。

1 个答案:

答案 0 :(得分:0)

charinteger相同。在VBA中,这意味着long(因为VBA使用16位术语)。没有涉及的字符串。要将整数或字符串转换为字符串,请使用chr(x)