2011-07-08 19 views
3

私はxmlの解析にMSXML 4.0を使用しています。msxmlプログラムの最終行でエラーが発生しました

プログラムが正常に動作しますが、プログラムが終了する直前に、私は db2.exeに0x00417be5で次の例外に

未処理の例外を取得:場所0x00b1c740を読んでアクセス違反 :0xc0000005で。ラインm_pInterface->Release();

_Release()方法でcomip.h

は、ここに私のコード

#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();の方法に問題がありますか?

おかげで、あなたはCoUninitialize呼び出した後

+0

それはおそらくメモリエラーです。デバッグしてください。 **なぜコピーを作成するのではなく、参照によって例外をキャッチしていないのですか?** – DumbCoder

+0

@DumbCoder私はC++を初めて使っていますので、例外で例外をキャッチする方法がわかりません。 – Searock

+0

@DumbCoder私は自分の質問を更新しました。見てください。 – Searock

答えて

5

あなたは暗黙的にCOMを使用しています。これは、MSXML2::IXMLDOMDocumentPtrのデストラクタで行われ、関数IXMLDOMDocument::Releaseが呼び出されます。

CoUninitializeは、これまでに呼び出された絶対最後のCOM関数でなければなりません。

これを変更すると正常に動作します。私はCoUninitializeMSXML2::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

関連する問題