如何将char *转换为BSTR?

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

这是示例代码:

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

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

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

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

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

详细说明(SysAllocStringLen()变体 – 它更短更快):

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

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

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

  4. 将BSTR传递给VB。 请享用。

  5. 调用SysFreeString()来释放BSTR。

使用_bstr_t

 _bstr_t bstrt(buffer); 

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

这是我用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终止符包含在结果中

我对ajryan的答案没有异议,但这里有另一种选择……

SysAllocString被定义为采用OLECHAR *类型的参数。 你给它一个char *。 这些不是一回事。 在某些情况下,它们可能是同一个东西,但你不能依赖它。 首先,您需要将char *转换为OLECHAR *。 有一个名为A2OLE的宏可以为你做这个,在那些char *和OLECHAR *是同一个东西的情况下,宏编译成什么都没有(我认为)。

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

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

而不是char *数组,请尝试_tchar * array.Because Sysallocstring只接受32位应用程序中的Unicode字符。