1

IXMLHttpRequest次のように、COMサーバー(.exe)で独自の実装を作成しました。

interface IMyXMLHttpRequest : IXMLHttpRequest {
    ...
};

coclass MyXMLHttpRequest {
    [default] interface IMyXMLHttpRequest;
};

問題は、ビルドがCOMサーバーを登録しようとすると、「OLEレジストリへのアクセス中にエラーが発生しました」というエラーが発生することです。登録コードをデバッグしましたが、失敗しRegisterTypeLibます。に関連するタイプ情報の一部を取得しようとしているようでありIXMLHttpRequest、(ここで推測して)そのインターフェイスに関連する一部のレジストリキーを変更できません。

から派生するのは明らかに間違っていますIXMLHttpRequestか?代わりに派生しIDispatchて、クラスにデュアルインターフェイスを使用させる必要がありますか?それとも、派生することは可能でIXMLHttpRequestあり、私たちはそれを間違っているだけですか?

更新:再現可能なテストケースをアップロードしました。VisualStudioウィザードを使用してATLCOMサーバーを生成し、それIXMLHttpRequestを実装するコクラスから派生した新しいインターフェイスを作成しました。説明したように、登録は失敗します。派生元のインターフェイスを変更すると、正常に機能しますIDispatch。Visual Studio 2010を使用し、昇格された特権で実行されているWindows 7で100%再現可能。

4

1 に答える 1

1

エラーMSB3073::VCEnd"がコード-2147319780で終了しました。

念のために言っておきますが、エラーは0x8002801C TYPE_E_REGISTRYACCESS「OLEレジストリへのアクセスエラー」です。

すでに特定したように、問題はIXMLHttpRequestタイプライブラリの外部で定義されたインターフェイスからの継承にあります。継承によってインターフェースを拡張することは、基本的に最初から良い考えではありません。はい、それは可能であり、それは理にかなっていますが、これを型ライブラリに入れて外部参照を作成することに近づくとすぐに、奇妙な問題が発生し始める可能性があります。

を参照するとすぐにIXMLHttpRequest、MIDLコンパイラはそれをタイプライブラリにも入れようとします。これは、中間ビルドファイルを調べることで確認できます。

IXMLHttpRequestの予期しないコピー

それはあなたが望んでいたものではありませんね?msxml6.dllsystem32(syswow64)ディレクトリのファイルにある別のタイプライブラリによってすでに定義およびホストされているため、参照したかっただけです。

主な質問は、なぜから継承したいのかということですIXMLHTTPRequest。ここでは、「通常の」個別の新しいIDispatchから派生したインターフェイスでは不十分だと思うのはなぜですか。IXMLHTTPRequestこのCOMクラスにも実装できます。そして、そもそもこの問題に巻き込まれることはないでしょう。

とにかく、構築の問題は、IDLで、コンパイラがIXMLHTTPRequestWindowsSDKファイルからの定義を直接認識していることです。

IDLファイルを次のように変更します。

import "oaidl.idl";
//import "ocidl.idl"; // <<--- Make direct IXMLHTTPRequest definition invisible

[
    uuid(7397D60F-A428-42C5-B698-9FA850638074),
    version(1.0),
]
library COMServerTestLib
{
    importlib("stdole2.tlb");
    importlib("msxml6.dll"); // <<--- Reference MSXML type library to import the right interface

C ++ファイルで、インターフェイスをC++コードで表示できるようにします。

#include "stdafx.h"
#include "resource.h"
#include <msxml6.h> // <<--- Re-add IXMLHTTPRequest definition for C++ code
#include "COMServerTest_i.h"

プロジェクトはここから再びビルド可能です。

于 2012-12-25T19:42:33.233 に答える