首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在DLL中调用从MS-Access VBA返回char *的C函数

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

Stack Overflow用户
提问于 2015-01-14 18:40:13
回答 1查看 534关注 0票数 2

我有一个DLL,它的函数声明如下:

代码语言:javascript
运行
复制
char * __declspec(dllexport) WINAPI test(int x);

我想在Access VBA中这样调用它:

代码语言:javascript
运行
复制
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中编写了一个函数:

代码语言:javascript
运行
复制
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写为

代码语言:javascript
运行
复制
BSTR CStrToVBStr(char *str)
{
    return SysAllocString(str);
}

并忽略了SysAllocString接受OLECHAR *而不是char *参数的警告。返回的字符串现在看起来不错,但是包含了空字符终止符,所以如果char *是"test",那么在VBA中len(s) =5,Right(s,1) = Chr(0)。

做我正在做的事情,正确的方法是什么?我看到的所有示例都是将char *作为参数,而不是返回值。我可以将test()更改为

代码语言:javascript
运行
复制
void __declspec(dllexport) WINAPI test(int x, char *result);

但我想知道我正在尝试做的事情是否可能。

我在Windows 7(64位)上使用Access 2007。

EN

回答 1

Stack Overflow用户

发布于 2015-01-14 19:18:46

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27940971

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档