我們正在將一個龐大的應用程序從32位移植到64位。這個應用程序有一些外部庫,我們禁用或使用他們的64位版本。 我們也通過自己寫的COM方法訪問數據庫。而且我們使用的MSXML4在32位上工作得很好。COM和MSXML存在問題(僅限64位)
沒有64位版本的MSXML4,所以我們升級到了MSXML6。我們只需要使用MSXML,特別是DOM解析器的一些功能,所以我們做的唯一的事情就是替補下面幾行:
和
MSXML2::IXMLDOMDocumentPtr pXMLDocPtr;
pXMLDocPtr.CreateInstance(___uuidof(MSXML2::DOMDocument60));
然後我們試圖做這樣的事情:
pXMLDocPtr->loadXML(_bstr_t(L"<?xml version=\"1.0\" encoding=\"utf-8\"?><abc></abc>"));
這在32位下正常工作。但在64位下,msxml6.dll在調用loadXML函數時會引發異常。雖然CreateInstance返回一個有效的指針並且返回碼是S_OK。還有在調試輸出打印一條錯誤消息:
First-chance exception at 0x000007fef888238e in App.exe: 0xC0000005: Access violation reading location 0xffffffffffffffff.
Unhandled exception at 0x000007fef888238e in App.exe: 0xC0000005: Access violation reading location 0xffffffffffffffff.
起初我們以爲,我們使用這個庫的方式是錯誤的,但後來我們發現瞭如下的事情。如果我們在初始化我們自己的COM組件之前閱讀我們的XML文件,它就可以工作。所以現在看起來我們自己的COM組件正在「破壞」COM庫。但這怎麼可能呢?
我們正在試驗一下,只有當我們嘗試使用MSXML時纔會出現問題。所有其他COM對象正在工作。除了有一次IFileDialog(也是我認爲的COM類)在使用過程中崩潰了。
在我們調用我們的COM組件的CoCreateInstance之後,問題就出現了,這在我們的例子中並沒有太大的作用。我在COM服務器上看不到任何明顯的錯誤,例如與64位數據類型。
所以,問題是:
是MSXML越野車的64位版本?
或者我們是否對COM服務器的64位端口發生了致命錯誤?
有沒有人遇到過類似的問題?
任何幫助將升值,因爲我現在真的陷入困境,因爲我不知道如何追查真正的問題。
我也將應用程序移植到64位,必須將MSXML4更改爲MSXML6,但加載和解析XML文檔時沒有任何錯誤;解析器庫不是越野車,至少不是建議的方式。嘗試創建一個獨立的簡單的64位應用程序,它使用MSXML並嘗試重現問題;我懷疑你能做到;那可能會在庫中顯示一個錯誤。 – 2011-06-09 15:05:29