2011-07-08 46 views
3

我正在使用MSXML 4.0來解析我的xml。msxml程序的最後一行出錯

程序工作正常,但在程序結束之前,我得到以下異常

未處理的異常在0x00417be5在 db2.exe:0000005:訪問衝突 閱讀位置0x00b1c740。

comip.h_Release()方法在行m_pInterface->Release();

這裏是我的代碼

#include <iostream> 
#include "stdafx.h" 
#include "Database.h" 
#include <sstream> 
#include <objbase.h> 
#import <msxml4.dll> 

using namespace std; 


void main(int argc, _TCHAR* argv[]) 
{ 
    ::CoInitialize(NULL); 
    MSXML2::IXMLDOMDocumentPtr pXMLDom; 
    HRESULT hr= pXMLDom.CreateInstance(__uuidof(MSXML2::DOMDocument40), NULL, CLSCTX_INPROC_SERVER); //Msxml2.DOMDocument.4.0 

    if (FAILED(hr)) 
    { 
     printf("Failed to instantiate an XML DOM.\n"); 
     //return 0; 
    } 

    try 
    { 
     pXMLDom->async = VARIANT_FALSE; 
     pXMLDom->validateOnParse = VARIANT_FALSE; 
     pXMLDom->resolveExternals = VARIANT_FALSE; 

     if(pXMLDom->load("users.xml") == VARIANT_TRUE) 
     { 
      printf("XML DOM loaded from users.xml:\n%s\n", (LPCSTR)pXMLDom->xml); 
     } 
     else 
     { 
      // Failed to load xml 
      printf("Failed to load DOM from stocks.xml. %s\n", 
        (LPCSTR)pXMLDom->parseError->Getreason()); 
     } 
     ::CoUninitialize(); 
    } 
    catch(_com_error errorObject) 
    { 
     printf("Exception thrown, HRESULT: 0x%08x", errorObject.Error()); 
    } 
    catch(...) 
    { 
     printf("Unknown error"); 
    } 
} 

我不知道什麼是錯我的程序。它只是在最後一行之前拋出一個異常。

有人可以指出我正確的方向嗎?

編輯:奇怪,我從我的程序中刪除::CoUninitialize();,它工作正常。

::CoUninitialize();方法有什麼問題?

感謝,

+0

這是最可能是內存錯誤。調試它,你應該看到它。 **爲什麼你不通過引用捕獲異常而不是複製?** – DumbCoder

+0

@DumbCoder我是新來的C++,所以我不知道如何通過引用捕獲異常,你能給我一個例子嗎? – Searock

+0

@DumbCoder我已更新我的問題。請看一看。 – Searock

回答

5

您都隱含使用COM你叫CoUninitialize後。這在MSXML2::IXMLDOMDocumentPtr的析構函數中完成,該函數調用函數IXMLDOMDocument::Release

CoUninitialize必須是絕對最後的COM函數。

進行這些更改,它會起作用。我確信CoUninitialize會的MSXML2::IXMLDOMDocumentPtr析構函數後調用:

void XMLDomTest() 
{ 
    MSXML2::IXMLDOMDocumentPtr pXMLDom; 
    HRESULT hr= pXMLDom.CreateInstance(__uuidof(MSXML2::DOMDocument40), NULL, CLSCTX_INPROC_SERVER); //Msxml2.DOMDocument.4.0 

    if (FAILED(hr)) 
    { 
     printf("Failed to instantiate an XML DOM.\n"); 
     return; 
    } 

    try 
    { 
     pXMLDom->async = VARIANT_FALSE; 
     pXMLDom->validateOnParse = VARIANT_FALSE; 
     pXMLDom->resolveExternals = VARIANT_FALSE; 

     if(pXMLDom->load("users.xml") == VARIANT_TRUE) 
     { 
      printf("XML DOM loaded from users.xml:\n%s\n", (LPCSTR)pXMLDom->xml); 
     } 
     else 
     { 
      // Failed to load xml 
      printf("Failed to load DOM from stocks.xml. %s\n", 
        (LPCSTR)pXMLDom->parseError->Getreason()); 
     } 
    } 
    catch(_com_error errorObject) 
    { 
     printf("Exception thrown, HRESULT: 0x%08x", errorObject.Error()); 
    } 
    catch(...) 
    { 
     printf("Unknown error"); 
    } 
} 

void main(int argc, _TCHAR* argv[]) 
{ 
    ::CoInitialize(NULL); 
    XMLDomTest(); 
    ::CoUninitialize(); 
} 
+0

+1非常感謝。 – Searock