如何将 char * 从 C dll 传递到 VB
这是示例代码:
void Cfunc(char *buffer,int len)
{
BSTR buf_bstr = SysAllocString((BSTR)buffer);
VBptr.VBfunc(buf_bstr,len);
}
此功能不起作用,实际上一些其他值被发送到 VB,而不是实际值。
有人可以提出解决方案吗?
呼叫MultiByteToWideChar()
,然后选择SysAllocString()
或SysAllocStringLen()
。
SysFreeString()
当您不再需要 BSTR 时不要忘记打电话。
详细(SysAllocStringLen()
变体 - 它更短更快):
调用MultiByteToWideChar()
并传递 0 作为第五和第六个参数。它将返回与 ANSI 字符串等效的 Unicode 字符数。请记住,ANSI 字符串可以包含任何字符,而不仅仅是 ASCII,因此在给定 ANSI 字符串长度的情况下手动计算 Unicode 字符数的任何尝试可能在某些情况下有效,而在其他情况下无效。
使用 为 BSTR 分配缓冲区SysAllocStringLen()
。传递 0 作为第一个参数,Unicode 字符的数量作为第二个参数。您现在有一个正确分配但未初始化的 BSTR。它已经有尾随零的位置,并且该尾随零已正确放置。
第二次调用MultiByteToWideChar()
,这次通过那里分配的 BSTR。该函数会将字符串转换为 Unicode 并将结果复制到 BSTR。现在您有一个正确分配的 BSTR,其中包含您的 ANSI 字符串的 Unicode 等价物。
将 BSTR 传递给 VB。享受。
调用SysFreeString()
以解除分配 BSTR。
这是我使用尖牙答案编写的代码
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 作为字符串长度会导致结果中包含空终止符
我对 ajryan 的回答没有任何异议,但这里有一个替代方案......
SysAllocString 被定义为采用 OLECHAR * 类型的参数。你给它一个 char *. 这些不是一回事。在某些情况下,它们可能是同一件事,但你不能依赖它。所以首先你需要将你的 char * 转换成 OLECHAR *。有一个名为 A2OLE 的宏可以为您执行此操作,并且在 char * 和 OLECHAR * 相同的情况下,宏编译为空(我认为)。
有关A2OLE 及其朋友的详细信息,请参阅此页面。
哦,将您的 char * 转换为 BSTR 实际上并没有改变它,它既不是 BSTR 也不是 OLECHAR *。
而不是 char* 数组,尝试 _tchar* 数组。因为 Sysallocstring 在 32 位应用程序中只接受 Unicode 字符。