描述:
最近,因为需要加载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:
---
老兄,用的IBM的 XML4c, c++专用的XMl解析包,
UP
我也遇到过这样的问题哪,
解决办法就是只有重复地试,直到没有错
管他配对否
在调用CoUninitialize之前Release所有的COM对象
因为CoUninitialize之后所有的COM操作都失败
有的C++类在析构时释放资源调用了COM相关的函数,
析构函数有可能会在CoUninitialize之后被调用,
因为我遇到过这种情况,你的程序我没看
up密切关注中
解决方案5:up