当前位置:  开发笔记 > 编程语言 > 正文

如何将char*转换为BSTR?

如何解决《如何将char*转换为BSTR?》经验,为你挑选了3个好方法。

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

这是示例代码:

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

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

有人可以建议一个解决方案?



1> Aidan Ryan..:

用途_bstr_t:

_bstr_t bstrt(buffer);

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



2> sharptooth..:

调用MultiByteToWideChar(),然后调用SysAllocString()或SysAllocStringLen().

当您不再需要BSTR时,不要忘记调用SysFreeString().

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

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

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

    第二次调用MultiByteToWideChar(),这次在那里传递分配的BSTR.该函数将字符串转换为Unicode并将结果复制到BSTR中.现在,您有一个合适的BSTR,其中包含与ANSI字符串相当的Unicode.

    将BSTR传递给VB.请享用.

    调用SysFreeString()来释放BSTR.



3> David Sykes..:

这是我用sharptooths回答的代码

    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作为字符串的长度会导致null终止符包含在结果中

推荐阅读
个性2402852463
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有