22

如何将 char * 从 C dll 传递到 VB

这是示例代码:

void Cfunc(char *buffer,int len)
{
  BSTR buf_bstr = SysAllocString((BSTR)buffer);
  VBptr.VBfunc(buf_bstr,len);
}

此功能不起作用,实际上一些其他值被发送到 VB,而不是实际值。

有人可以提出解决方案吗?

4

5 回答 5

22

呼叫MultiByteToWideChar(),然后选择SysAllocString()SysAllocStringLen()

SysFreeString()当您不再需要 BSTR 时不要忘记打电话。

详细(SysAllocStringLen()变体 - 它更短更快):

  1. 调用MultiByteToWideChar()并传递 0 作为第五和第六个参数。它将返回与 ANSI 字符串等效的 Unicode 字符数。请记住,ANSI 字符串可以包含任何字符,而不仅仅是 ASCII,因此在给定 ANSI 字符串长度的情况下手动计算 Unicode 字符数的任何尝试可能在某些情况下有效,而在其他情况下无效。

  2. 使用 为 BSTR 分配缓冲区SysAllocStringLen()。传递 0 作为第一个参数,Unicode 字符的数量作为第二个参数。您现在有一个正确分配但未初始化的 BSTR。它已经有尾随零的位置,并且该尾随零已正确放置。

  3. 第二次调用MultiByteToWideChar(),这次通过那里分配的 BSTR。该函数会将字符串转换为 Unicode 并将结果复制到 BSTR。现在您有一个正确分配的 BSTR,其中包含您的 ANSI 字符串的 Unicode 等价物。

  4. 将 BSTR 传递给 VB。享受。

  5. 调用SysFreeString()以解除分配 BSTR。

于 2009-03-03T11:59:59.797 回答
22

使用_bstr_t

_bstr_t bstrt(buffer);

这是字符串转换文章的圣杯

于 2009-03-03T11:51:15.730 回答
13

这是我使用尖牙答案编写的代码

    int wslen = MultiByteToWideChar(CP_ACP, 0, str, strlen(str), 0, 0);
    BSTR bstr = SysAllocStringLen(0, wslen);
    MultiByteToWideChar(CP_ACP, 0, str, strlen(str), bstr, wslen);
    // Use bstr here
    SysFreeString(bstr);

请注意,使用 -1 作为字符串长度会导致结果中包含空终止符

于 2013-06-12T13:21:43.737 回答
2

我对 ajryan 的回答没有任何异议,但这里有一个替代方案......

SysAllocString 被定义为采用 OLECHAR * 类型的参数。你给它一个 char *. 这些不是一回事。在某些情况下,它们可能是同一件事,但你不能依赖它。所以首先你需要将你的 char * 转换成 OLECHAR *。有一个名为 A2OLE 的宏可以为您执行此操作,并且在 char * 和 OLECHAR * 相同的情况下,宏编译为空(我认为)。

有关A2OLE 及其朋友的详细信息,请参阅此页面。

哦,将您的 char * 转换为 BSTR 实际上并没有改变它,它既不是 BSTR 也不是 OLECHAR *。

于 2009-03-03T11:58:28.957 回答
1

而不是 char* 数组,尝试 _tchar* 数组。因为 Sysallocstring 在 32 位应用程序中只接受 Unicode 字符。

于 2014-01-27T10:31:27.820 回答