COM オブジェクトごとに 1 つの IDispatch 実装しかないため、IDispatch::Invokeなどの呼び出しを成功させるには、COM オブジェクトごとに一意の DISPID が必要です。
編集:実際、ハンスがコメントで指摘しているように、実際、それについてもっと考えた後、質問はまったく無関係です. ClassInterfaceType を None として定義しているため、.NET は最初のインターフェイス IMyInterface1 dispids のみを使用可能にすることを意味します (既定では、ComDefaultInterfaceAttributeクラス属性を使用して既定のインターフェイスを構成できます)。
ClassInterfaceType を AutoDual または AutoDispatch として使用する場合、DISPID は自動生成され、手動で定義されたものは使用されません。
.NET はインターフェイスを組み合わせたりマージしたりしません。したがって、dispid が異なるという事実は、この ".NET が COM として公開された" ケースでは重要ではありません。これは、1 つの DISPID セットのみが (既定のインターフェイスに対して) 使用されるためです。同じクラスで同じ DISPID のセットを 2 回定義すると、正常にコンパイルされますが、regasm は文句を言い、重複したものを無視することに注意してください。
以下は、これらすべてを確認する小さな C++ プログラムです。
int _tmain(int argc, _TCHAR* argv[])
{
CoInitialize(NULL);
IDispatch *pDispatch;
CoCreateInstance(__uuidof(MyClass), NULL, CLSCTX_ALL, IID_IDispatch, (void**)&pDispatch);
DISPID dispid;
LPOLESTR name1 = L"Name1";
LPOLESTR name2 = L"Name2";
HRESULT hr;
hr = pDispatch->GetIDsOfNames(IID_NULL, &name1, 1, 0, &dispid);
printf("Name1:%i hr=0x%08X\n", dispid, hr);
hr = pDispatch->GetIDsOfNames(IID_NULL, &name2, 1, 0, &dispid);
printf("Name2:%i hr=0x%08X\n", dispid, hr);
pDispatch->Release();
CoUninitialize();
return 0;
}
これは次のように出力されます。
Name1:1 hr=0x00000000 (S_OK)
Name2:-1 hr=0x80020006 (DISP_E_UNKNOWNNAME)
AutoDispatch または AutoDual に変更すると、次のように出力されます (ID は何らかのアルゴリズムを使用して計算されます)。
Name1:1610743812 hr=0x00000000
Name2:1610743813 hr=0x00000000