2

ac# com インターフェイスでは、このようなデフォルト メンバーを定義できます。

[InterfaceType(ComInterfaceType.InterfaceIsDual)]
[ComVisible(true)]
public interface IMyComClass
{
    [DispId(0)] string Item{get;}
}

IDispatch (またはデュアル) を使用すると、すべてが期待どおりに機能し、VBA からは次のようにプロパティを省略できます

Dim o1 As New MyComClass
Debug.Print o1 'this is equivalent to o1.Item

しかし、インターフェイスを IUnknown としてのみ定義すると、機能しません。Excel オブジェクト ブラウザでは、「青い点」でマークされ、「既定のメンバー」というラベルが付いたプロパティがまだ表示されます。ただし、.Item は VBA コードで明示的に指定する必要があります。

IUnknown の既定のプロパティを IDispatch のように動作させる方法はありますか?

4

1 に答える 1

4

いいえ、既定のプロパティは、IDispatch 派生インターフェイスにのみ適用できる概念です。Debug.Print ステートメントで使用する遅延バインディングは、IUnknown インターフェイスでは機能しません。インターフェイスを実装するコクラスには、番号で選択された関数を呼び出すために必要な機構がありません。

IDispatch ::Invoke() メソッドを確認してください。これがジョブを完了させるメソッドです。デフォルトのメンバーを使用するには、最初の引数に 0 を渡すだけです。

オブジェクト ブラウザに見られる癖は無視してください。COM オブジェクトがオートメーションをサポートしていることを完全に前提としています。

于 2014-11-19T11:42:42.927 に答える