3

巨大なアプリケーションを 32 ビットから 64 ビットに移植しています。このアプリケーションには、いくつかの外部ライブラリがあり、それらを無効にするか、64 ビット バージョンを使用しました。また、自分で作成した COM メソッドを介してデータベースにアクセスしています。また、32 ビットで問題なく動作する MSXML4 を使用していました。

MSXML4 には 64 ビット バージョンがないため、MSXML6 にアップグレードしました。MSXML のいくつかの機能、特に DOM パーサーを使用するだけなので、次の行を置き換えるだけです。

#import "msxml6.dll"

MSXML2::IXMLDOMDocumentPtr pXMLDocPtr;
pXMLDocPtr.CreateInstance( ___uuidof( MSXML2::DOMDocument60 ) );

次に、次のようなことを試みます。

pXMLDocPtr->loadXML( _bstr_t( L"<?xml version=\"1.0\" encoding=\"utf-8\"?><abc></abc>" ) );

これは 32 ビットで正常に動作します。しかし、64 ビットでは、loadXML 関数が呼び出されると msxml6.dll が例外をスローします。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 を呼び出した直後に発生しますが、この場合はあまり効果がありません。また、64 ビット データ型など、COM サーバーで明らかなエラーは見られません。

質問は次のとおりです。

MSXML の 64 ビット バージョンにはバグがありますか?

それとも、COM サーバーの 64 ビット ポートで致命的なミスを犯したのでしょうか?

誰かが同様の問題を経験しましたか?

実際の問題を追跡する方法がわからないため、現時点で本当に行き詰まっているので、助けていただければ幸いです。

4

1 に答える 1

0

その一般的な理由は、予期しない呼び出しです。CoUninitialize()これにより、すべての COM オブジェクトが解放され、それらへのすべてのポインターがぶら下がります。例については、この質問を参照してください

于 2011-06-09T13:13:11.120 に答える