Es gibt nur eine IDispatch-Implementierung pro COM-Objekt, also, wenn Sie einen Anruf wie IDispatch::Invoke erfolgreich sein wollen, müssen Sie DISPIDs einzigartige pro COM-Objekt haben.
EDIT: In der Tat, nach mehr darüber nachzudenken, ist die Frage ziemlich irrelevant, wie Hans in seinem Kommentar darauf hinweist. Da Sie ClassInterfaceType als None definieren, bedeutet dies, dass .NET nur die erste Schnittstelle IMyInterface1 dispids verwendbar macht (standardmäßig, aber Sie können die Standardschnittstelle mit dem Klassenattribut konfigurieren).
Und wenn Sie ClassInterfaceType als AutoDual oder AutoDispatch verwenden, werden DISPIDs automatisch generiert, und die manuell definierte wird nicht verwendet.
.NET kombiniert oder zusammenführen die Schnittstellen nicht, und die Tatsache, dass die DISPIDs unterschiedlich sind, ist daher nicht wichtig in diesem Fall ".NET als COM offengelegt", da nur eine Gruppe von DISPIDs (für die Standardschnittstelle) verwendet wird). Beachten Sie, wenn Sie zweimal die gleiche Gruppe von DISPIDs für dieselbe Klasse definieren, wird es gut kompilieren, aber regasm wird sich beschweren und die doppelten ignorieren.
Hier ist eine kleine C++ Programm, das dies alles bestätigt:
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;
}
gibt er dies:
Name1:1 hr=0x00000000 (S_OK)
Name2:-1 hr=0x80020006 (DISP_E_UNKNOWNNAME)
Es Sie Änderung AutoDispatch oder AutoDual, wird es ausgegeben diese (ids berechnet werden mit einigem Algorithmus):
Name1:1610743812 hr=0x00000000
Name2:1610743813 hr=0x00000000
Die erste Schnittstelle, die Sie auflisten, ist die einzige, die VB6 sehen kann, wenn es spät bindet. Es wird die Schnittstelle sein, die als die [Standard] Schnittstelle markiert ist. Also kein echtes Problem, da die andere Schnittstelle sowieso nicht verwendbar ist. Obwohl das wahrscheinlich ein echtes Problem ist;) –