Chỉ có một IDispatch thực hiện mỗi đối tượng COM, vì vậy nếu bạn muốn có một cuộc gọi như IDispatch::Invoke để thành công, bạn cần phải có DISPIDs độc đáo cho mỗi đối tượng COM.
EDIT: Trong thực tế, sau khi suy nghĩ thêm về nó, câu hỏi là khá không liên quan, như Hans chỉ ra trong bình luận của mình. Bởi vì bạn định nghĩa ClassInterfaceType là None, nó có nghĩa là .NET sẽ chỉ làm cho giao diện đầu tiên của IMyInterface1 có thể sử dụng được (theo mặc định, nhưng bạn có thể cấu hình giao diện mặc định bằng cách sử dụng thuộc tính Class ComDefaultInterfaceAttribute).
Và nếu bạn sử dụng ClassInterfaceType làm AutoDual hoặc AutoDispatch, DISPID sẽ được tạo tự động và xác định thủ công sẽ không được sử dụng. .NET không kết hợp hoặc hợp nhất các giao diện, và thực tế là các phân phối khác nhau là không quan trọng trong trường hợp ".NET tiếp xúc như COM" này, vì chỉ có một bộ DISPID được sử dụng (cho giao diện mặc định).). Lưu ý nếu bạn xác định hai lần cùng một tập hợp các DISPID trên cùng một lớp, nó sẽ biên dịch tốt, nhưng regasm sẽ khiếu nại và bỏ qua những người trùng lặp.
Dưới đây là một chương trình nhỏ C++ xác nhận tất cả điều này:
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;
}
Nó sẽ ra này:
Name1:1 hr=0x00000000 (S_OK)
Name2:-1 hr=0x80020006 (DISP_E_UNKNOWNNAME)
Nó bạn thay đổi để AutoDispatch hoặc AutoDual, nó sẽ sản lượng này (id được tính sử dụng một số thuật toán):
Name1:1610743812 hr=0x00000000
Name2:1610743813 hr=0x00000000
Giao diện đầu tiên bạn liệt kê là giao diện duy nhất mà VB6 có thể thấy khi liên kết muộn. Nó sẽ là giao diện được đánh dấu là giao diện [Mặc định]. Vì vậy, không phải là một vấn đề thực sự vì giao diện khác là không thể sử dụng anyway. Mặc dù đó có thể là một vấn đề thực sự;) –