IUnknownから派生したインターフェイスをIDLでデュアルとしてマークする意味はありますか?
-
06-07-2019 - |
質問
コードを確認すると、.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 ?