5

コードを確認すると、.idl ファイルの 1 つに興味深い定義が見つかりました。

[
    object,
    uuid(uuidhere),
    dual,
    nonextensible,
    oleautomation,
    hidden
]
interface IOurInterface : IUnknown {
    //methods here
};

から直接派生したインターフェイスIUnknownがデュアル インターフェイスになる可能性があるのはなぜですか? dual属性を削除すると何か壊れますか?

4

2 に答える 2

3

ユーザーボイスのマーシャリングに関する別の質問に対するこの回答では、基本的に次のように述べているこの記事を指しています。

インターフェイス (IDispatch 派生かどうかに関係なく) がいずれかまたは両方 (または両方) にマークさdualoleautomationている場合、呼び出されたときに特別に処理さRegisterTypeLib()れます (これは通常、DllRegisterServer によって行われます)。このようなインターフェイスごとに HKCR\Interface{InterfaceId} キーが作成され、その下で {00020424-0000-0000-C0000-000000000046} クラスがプロキシ/スタブとして参照されます。このクラス ID は、oleautomation マーシャラーとも呼ばれる typelib マーシャラーに対応します。

于 2009-11-16T12:43:30.773 に答える
1

ここのドキュメントを考えると、それが機能する理由がわかりません: http://msdn.microsoft.com/en-us/library/aa366807(VS.85).aspx

dual 属性によって識別されるインターフェイスは、オートメーションと互換性があり、IDispatch から派生している必要があります。この属性はディスパッチ インターフェイスでは許可されていません。

[dual]属性が暗黙的にインターフェイスに追加されている可能性がIDispatchあります。

あなたができることは、インターフェイスを実装するコードをチェックすることです (これが ATL であると仮定します) IDispatchImpl。もしそうなら、それは実際に QI for に応答し、そのようIDispatchに使用される可能性があります。

もう 1 つの方法は、実装IOurInterfaceしているオブジェクトをインスタンス化し、その QI を実行IDispatchすることです。成功した場合、おそらくそれを削除することはできません。

実際、考え[dual]てみるIDispatchと、カスタム インターフェイスとIDispatch?

于 2009-11-02T06:11:28.620 に答える