您好,欢迎来到[编程问答]网站首页   源码下载   电子书籍   软件下载   专题
当前位置:首页 >> 编程问答 >> VC/MFC >> bstr 类型引发的困惑,求助

bstr 类型引发的困惑,求助

来源:网络整理     时间:2016/8/23 15:17:04     关键词:

关于网友提出的“ bstr 类型引发的困惑,求助”问题疑问,本网通过在网上对“ bstr 类型引发的困惑,求助”有关的相关答案进行了整理,供用户进行参考,详细问题解答如下:

问题: bstr 类型引发的困惑,求助
描述:

用VC 写了一个组件 InteractionHandle(BSTR inxml, VARIANT *RetCode, BSTR *outxml)
*outxml = XMLDom->xml; 返回
然后遇到这样一个问题
当数据量不够大时,客户端正常!当数据量大时outxml丢失  但是这时用MessageBox(NULL,XMLDom->xml,"",MB_OK);显示内容是完整的...
InteractionHandle(BSTR inxml, VARIANT *RetCode, char *outxml)
测试时定义一个中间变量
buffer[40960] 可以正常通过Messagebox显示,但是
strcpy(outxml,buffer)客户端直接挂掉
一直怀疑是BSTR 类型有长度限制,但网上搜寻很久无解,望高手赐教~!


解决方案1:

char* 是不可以直接向 BSTR转的,BSTR的实质是WCHAR*。
如果一定要使用strcpy,也应该使用lstrcpy,这是一个Windows函数。
正确的方法,应该是动态申请一块内存,由WCHAR指针来执行操作
WCHAR* pszBuffer = new WCHAR[内存大小]; memset(pszBuffer, 0, sizeof(WCHAR)*内存大小);
然后执行操作,将pszBuffer传入,用于接收输出。
InteractionHandle(BSTR inxml, VARIANT *RetCode, BSTR *outxml)
再用Windows API函数:WideCharToMultiByte将其转为char*。
UINT nSize = ::WideCharToMultiByte(CP_ACP, NULL, pszBuffer, wcslen(pszBuffer), NULL, NULL, NULL, NULL);
char* pszTarget = new char[nSize+1]; memset(pszTarget, 0, sizeof(char)*(nSize+1));
::WideCharToMultiByte(CP_ACP, NULL, pszBuffer, wcslen(pszBuffer), pszTarget, nSize, NULL, NULL);
然后释放WCHAR内存。
delete[] pszBuffer; pszBuffer = NULL;
再然后,使用pszTarget。
最后,释放pszTarget。
delete pszTarget; pszTarget = NULL;

解决方案2:

BSTR是带前缀的UNICODE字符串。
你得用SysAllocString来分配才行。
你的控件负责给outxml分配内存,
*outxml = SysAllocString(buffer); // buffer必须是UNICODE

解决方案3:


char* 转到 BSTR,一般不用 strcpy吧。容易出问题。
一般使用 SysAllocString 或直接 BSTR bstr=_bstr_t(pChar);
InteractionHandle(BSTR inxml, VARIANT *RetCode, BSTR &outxml)
outxml=_bstr_t(buffer);


以上介绍了“ bstr 类型引发的困惑,求助”的问题解答,希望对有需要的网友有所帮助。
本文网址链接:http://www.codes51.com/itwd/3527127.html

相关图片

相关文章