2011-06-02 41 views
1

在一個小的測試項目,我有這樣的代碼:CoCreateInstance的 - 的COM +註冊表數據庫檢測到系統錯誤

HRESULT hr = CoCreateInstance(CLSID_DOMDocument, NULL, CLSCTX_ALL, __uuidof(IXMLDOMDocument), (void **) & m_pDoc); 
if (hr != S_OK) 
{ 
    throw "MSXML DOM Document could not be created"; 
} 

這編譯和運行流暢。在另一個項目中相同的代碼失敗:

HR = 0x80110474的COM +註冊表數據庫檢測到系統錯誤

兩個項目都是C++編譯使用Visual Studio 2010中我已經通過比較設置並排在兩個項目之間嘗試並確定可能導致此問題的差異。到目前爲止,我看不出爲什麼測試項目運行而另一個項目失敗。

編輯 - 全樣本代碼:

#include "stdafx.h" 
#include <atlbase.h> 
#include <atlconv.h> 
#include "MsXml.h" 
int _tmain(int argc, _TCHAR* argv[]) 
{ 
    IXMLDOMDocument* m_pDoc = NULL; 
    if(FAILED(CoInitializeEx(0, COINIT_MULTITHREADED))) 
     if(FAILED(CoInitializeEx(0, COINIT_APARTMENTTHREADED))) 
     throw "Could not initialize COM"; 
    HRESULT hr = CoCreateInstance(CLSID_DOMDocument, NULL, CLSCTX_ALL, __uuidof(IXMLDOMDocument), (void **) & m_pDoc); 
    if (hr != S_OK) 
     throw "MSXML DOM Document could not be created"; 
    return 0; 
} 
+0

你是如何註冊組件ID CLSID_DOMDocument的?你是如何在兩個項目中引用它的? – 2011-06-02 01:42:03

+0

CLSID_DOMDocument是Microsoft的MSXML包的一部分。並使用其安裝程序進行安裝。 – FattyPotatoes 2011-06-02 01:51:11

+0

這是Windows中的預裝組件,請務必不要自行安裝。爲什麼這會產生一個COM +錯誤,這在代碼片段中是無法猜測的。假設該機器上的註冊表狀態不佳可能是一個很好的猜測。 – 2011-06-02 02:20:32

回答

1

找到了解決辦法,雖然不是理想的IT解決了這個問題。我創建了一個新項目並手動導入了設置。

0

我有Turbo Delphi的同樣的問題:與CoCreateInstance()相同的代碼在一個項目中工作,在另一個項目中失敗,HR = 80110474(COMADMIN_E_REGDB_SYSTEMERR)。它是由IDE重寫存儲在項目設置中的環境變量引起的。所以它只有在IDE下運行時纔會失敗(不管調試狀態如何)。清理項目設置可解決問題。