问题还是出在俺对 COM 相关的数据类型以及 XML 一知半解上,
搜索、测试的中间过程就不说了,最终还是通过 BSTR 查到 MSDN 网站上,
才解决了问题。
MSDN 里面对 BSTR 的使用说明如下,大家一看便知:
===============================================================================
分配和释放 BSTR 的内存
当创建 BSTR 并在 COM 对象之间传递它们时,必须小心地处理它们所使用的内存以避免内存泄漏。当 BSTR 停留在接口中时,在完成其使用后必须释放出它的内存。但是,如果 BSTR 传递出了接口,那么接收对象将负责它的内存管理。
一般情况下,分配和释放分配给 BSTR 的内存的规则如下:
当调用进来一个需要 BSTR 参数的函数时,必须在调用之前为 BSTR 分配内存,并且在完成操作之后将其释放。例如:
HRESULT IWebBrowser2::put_StatusText( BSTR bstr );
// shows using the Win32 function
// to allocate memory for the string:
BSTR bstrStatus = ::SysAllocString( L"Some text" );
if (bstrStatus == NULL)
return E_OUTOFMEMORY;
pBrowser->put_StatusText( bstrStatus );
// Free the string:
::SysFreeString( bstrStatus );
//...
当调用进来一个返回 BSTR 的函数时,必须自己来释放字符串。例如:
HRESULT IWebBrowser2::get_StatusText( BSTR FAR* pbstr );
//...
BSTR bstrStatus;
pBrowser->get_StatusText( &bstrStatus );
// shows using the Win32 function
// to freee the memory for the string:
::SysFreeString( bstrStatus );
当实现返回 BSTR 的函数时,请分配字符串,但不要释放它。接收函数会释放内存。例如:
// Example shows using MFC's
// CString::AllocSysString
//...
HRESULT CMyClass::get_StatusText( BSTR * pbstr )
{
try
{
//m_str is a CString in your class
*pbstr = m_str.AllocSysString( );
}
catch (...)
{
return E_OUTOFMEMORY;
}
// The client is now responsible for freeing pbstr.
return( S_OK );
}
//...
===============================================================================
链接:
http://msdn.microsoft.com/library/chs/default.asp?url=/library/CHS/vccore/html/vcconstringsallocatingreleasingmemoryforbstr.asp
原来我们的代码片段如下:
XMLDOC->createElement(CComBSTR(L"RecordNo"),&pElement);
pElement->put_text( WideString( IntToStr( array[i].RecordNo ) ) );
修改之后片段如下:
BSTR bstr = NULL;
XMLDOC->createElement(CComBSTR(L"RecordNo"),&pElement);
bstr = ::SysAllocString( WideString( IntToStr( array[i].RecordNo ) ) );
pElement->put_text( bstr );
::SysFreeString( bstr );
分析原因,就是前面帖子所说的,put_text( ... ) 在隐含地将 WideString 转换成
BSTR 的过程中为 BSTR 分配了内存,而原来的程序没有释放该内存。修改之后的代码
就没有这个问题了。
多谢大家对此问题的关注和提供的帮助 :)
大家都是出来卖的,何苦自己人为难自己人
那些活好的,或者活新的,或者花样多的,
或者老板拉皮条功夫好能拉到肯多花钱的客的,
拜托不要老是打击年老色衰的同行了
老鱼记事 老鱼侃棋 老鱼围脖