关于网友提出的“ 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