Интерфейс реализации 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 должны быть зарегистрированы, чтобы использовать стандартный маршаллер. В противном случае вы должны убедиться, что правильно указали информацию о маршалинге в своих манифестах, как указано здесь.

Другие вопросы по тегам