IUnknownから派生したインターフェイスをIDLでデュアルとしてマークする意味はありますか?

StackOverflow https://stackoverflow.com/questions/1636148

質問

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

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

IUnknown から直接派生したインターフェイスをデュアルインターフェイスにするにはどうすればよいですか? dual 属性を削除すると、何かが壊れますか?

役に立ちましたか?

解決

この回答マーシャリングに関する別の質問ユーザーvoyce は、この記事には基本的に次のように記載されています:

インターフェイス(IDispatch派生または非派生)が dual または oleautomation (またはその両方)のいずれかとマークされている場合、 RegisterTypeLib()が呼び出されます(通常、DllRegisterServerによって実行されます)。そのような各インターフェイスに対して、HKCR \ Interface {InterfaceId}キーが作成され、その下で{00020424-0000-0000-C0000-000000000046}クラスがプロキシ/スタブとして参照されます。このクラスIDは、oleautomation marshallerとしても知られるtypelib marshallerに対応しています。

他のヒント

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

  

デュアルによって識別されるインターフェイス   属性と互換性がなければなりません   自動化と派生   IDispatch。この属性は   ディスパッチインターフェイスで許可されています。

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

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

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

実際に考えてみると、カスタムインターフェイスと<の両方を実装する限り、 [dual] は技術的に IDispatch から派生することを要求しないかもしれません。 code> IDispatch ?

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top