Интерфейс реализации COM-класса из другой библиотеки типов
Я относительно новичок в COM, поэтому извиняюсь, если это глупый вопрос. У меня есть куча COM-интерфейсов, скомпилированных в библиотеку типов А. Эта библиотека типов является ресурсом в одной из библиотек DLL (a.dll) в моем решении. В отдельной библиотеке типов (B), которая входит в отдельную DLL (b.dll), я хотел бы определить кокласс, который реализует интерфейс из библиотеки типов A. Посмотрите код IDL ниже как упрощенный пример того, что я имею в виду:
import "oaidl.idl";
import "ocidl.idl";
// Import IMyInterface, which is part of MyLibA.tlb
import "MyInterface.idl";
[
uuid(E80492A8-1E8C-4ABF-B4DE-9C252C445AFE),
version(1.0),
helpstring("MyLibB Type Library")
]
library MyLibB
{
importlib("stdole32.tlb");
importlib("stdole2.tlb");
importlib("MyLibA.tlb);
[
uuid(25E3CD5E-FA06-4845-BE3E-F260985AFB20),
helpstring("My CoClass")
]
coclass MyCoClass
{
[default] interface IMyInterface;
};
};
Я могу скомпилировать вышеупомянутое хорошо, но когда я открываю файл tlb, сгенерированный MIDL в oleview, я получаю сообщение об ошибке TYPE_E_CANTLOADLIBRARY
, Я начинаю подозревать, что я хочу сделать не возможно. Мои эксперименты до сих пор показывают, что библиотеки типов должны содержать все интерфейсы, которые реализует кокласс, а также само определение кокласса. Это правда?
Если я удалю importlib("MyLibA.tlb);
Заявление, я могу просмотреть скомпилированный файл TLB в Oleview без ошибок, но MyLibB.tlb затем также содержит определение IMyInterface
интерфейс, т.е. интерфейс определяется дважды в обеих библиотеках типов. Я не хочу этого, потому что в моем приложении я загружаю a.dll и b.dll с помощью COM без регистрации. В этом сценарии генерация контекста активации завершается неудачно, когда встречается одно и то же определение интерфейса в нескольких библиотеках типов.
Какие-нибудь предложения, как я могу достигнуть желаемого разделения интерфейса и Coclass в отдельных библиотеках типов?
1 ответ
Когда OLE/COM Viewer показывает TYPE_E_CANTLOADLIBRARY
это обычно означает, что другой TLB, на который ссылается тот, который открывается, не зарегистрирован должным образом.
Исправление заключается в регистрации зависимости TLB (в данном случае MyLibA.tlb) с помощью такого инструмента, как regtlb
или же regtlib
или альтернативный, в зависимости от вашей системы.
Поскольку вопрос задается в контексте COM без регистрации, вы должны знать о возможной проблеме, связанной с маршалингом экземпляров интерфейса. Как правило, TLB должны быть зарегистрированы, чтобы использовать стандартный маршаллер. В противном случае вы должны убедиться, что правильно указали информацию о маршалинге в своих манифестах, как указано здесь.