最近,因为需要加载XML文件,从网上下载了一个XMLParse类,使用中发现如下问题:
工作环境: VC6.0 win32 with MFC surport, 后转化成VS.2003。问题1:  开始使用时,发现不能用,跟踪调试到
BOOL XMLParser::InitMSXML()
{
ClearErrMsg(); // -- Init OLE Object Comunication for MSXML (only once time)--
static bool ole_initialized = false;
if (!ole_initialized)
{
::AfxOleInit();
// Initialize COM
// ::CoInitialize(NULL);
ole_initialized = true;
} // -- Instantiate an XML document --
HRESULT hr = m_pDomDocument.CreateInstance(CLSID_DOMDocument);
if (FAILED(hr))

_com_error er(hr);
SetErrMsg(er.ErrorMessage());
return FALSE;
} return TRUE;
}发现是COM初始化问题,于是添加
     ::CoInitialize(NULL);
但在程序结束时, 添加
::CoUninitialize(); //释放程序占用的COM 资源
程序报错,错误在<comip.h> 
_Release() 函数的m_pInterface->Release();
这是什么原因?问题2:
用如下语句测试:
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
int nRetCode = 0; // initialize MFC and print and error on failure
if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
{
// TODO: change error code to suit your needs
cerr << _T("Fatal Error: MFC initialization failed") << endl;
nRetCode = 1;
}
else
{
// TODO: code your application's behavior here.
// LoadData(); // 加载数据;
// TestDA(); // 测试CDataArray
// DisplayData();
// TestFormular();
// TestFmrMgr();
// ClearUp();

} return nRetCode;
}DevPartner居然提示有Resource leak,错误在
C:\Program Files\Microsoft Visual Studio\VC98\INCLUDE\delayhlp.cpp
extern "C"
BOOL WINAPI
__FUnloadDelayLoadedDLL(LPCSTR szDll) {
    
    BOOL        fRet = FALSE;
    PUnloadInfo pui = __puiHead;
    
    for (pui = __puiHead; pui; pui = pui->puiNext) {
        if (memcmp(szDll, pui->pidd->szName, strlen(pui->pidd->szName)) == 0) {
            break;
            }
        }    if (pui && pui->pidd->pUnloadIAT) {    // DevPartner提示这里出错
        PCImgDelayDescr pidd = pui->pidd;
        HMODULE         hmod = *pidd->phmod;        OverlayIAT(pidd->pIAT, pidd->pUnloadIAT);
        ::FreeLibrary(hmod);
        *pidd->phmod = NULL;
        
        delete reinterpret_cast<ULI*> (pui);        fRet = TRUE;
        }    return fRet;
    }
这是什么回事? 难道是MS Bug?问题3 :
如下语句Devpartner提示内存溢出,
_bstr_t bstrFileName;
bstrFileName = m_strFilePath.AllocSysString(); VARIANT_BOOL vResult;
vResult = m_pDomDocument->load(static_cast<_variant_t>(bstrFileName));
if (vResult == VARIANT_TRUE) // success!
{
m_pDocRoot = m_pDomDocument->documentElement; 
GotoRoot();
return TRUE;
}
else
{
m_strErrMsg = "XML Document FAILED to load";
m_bIsError = true;
return FALSE;
}
错误在:
D:\NET 2003\Vc7\atlmfc\include\cstringt.h
BSTR bstr = ::SysAllocStringLen( NULL, nLen );我认为是bstrFileName = m_strFilePath.AllocSysString();语句中的unicode字符串没有释放,但是我看了一下_bstr_t类的说明,其采用引用计数方法,会在其析构函数里面释放,应该不会有内存溢出阿?如何解决呢?
我强行采用SysFreeString(bstrFileName.GetBSTR());却产生指针错误!

解决方案 »

  1.   

    在调用CoUninitialize之前Release所有的COM对象
    因为CoUninitialize之后所有的COM操作都失败有的C++类在析构时释放资源调用了COM相关的函数,
    析构函数有可能会在CoUninitialize之后被调用,
    因为我遇到过这种情况,你的程序我没看
      

  2.   

    第一个问题已解决,我是把它放到主函数里面。估计是因为当COM环境释放后,XMLParse类对象还没释放,从而调用release出错!现在就第二个问题没解决了!
      

  3.   


    ---
    老兄,用的IBM的 XML4c, c++专用的XMl解析包,