Re[2]: Архитектура Plug-in в концепции СOM
От: Аноним  
Дата: 22.04.04 08:11
Оценка:
Здравствуйте, algol, Вы писали:

A>Здравствуйте, Аноним, Вы писали:


А>>2. Интерфейс IPlaginInterface объявляетсья в IDL файле. Соответсвенно я могу этот IDL импортить и создавать коклассы (Плагины) которые его реализуют. Но опять — это не совсем корректный подход — ведь некоторые языки не поддерживают IDL в чистом виде, а в TLB интерфейс не попадает (надеюсь поянтно почему). Как грамотно определять интерфейсы, чтобы их можно было реализовывать из разных языков?


A>Можно определить IPlaginInterface в основном приложении, если там есть TLB, или скомпилировать отдельную TLB. Это можно сделать .bat файлом:

A>
A>call vcvars32.bat
A>midl myplagin.idl
A>


Эта IDL должна содержать library секцию (потому как без нее tlb будет пустой).
эта несколько странно ( ведь обычно интерфейс не привязан к библиотеке типов? или я не прав)

Но при таком подходе у меня получаються следующий грабли

IDL с интерфейсом (фалй PlaginInterface.idl)

import "oaidl.idl";
import "ocidl.idl";

[
    uuid(89F9B3D3-4FFB-4c28-8FDD-035D4C210509),
    version(1.0),
    helpstring("Plagin Interface 1.0 Type Library")
]

library IPlaginLib
{

    importlib ("stdole32.tlb");
    importlib ("stdole2.tlb");

    [
        object,
        uuid(115E293B-28CE-4c55-8468-F08242F5191C),
        helpstring(" IPlaginInterface")
    ]
    interface IPlaginInterface: IUnknown
    {
        HRESULT        SomeFunc();
    };

};


Компилируем его в TLB. Далее создаем кокласс (в другом например пректе).
Его IDL


import "oaidl.idl";
import "ocidl.idl";

[
    uuid(F1ACE1C1-60BF-4A96-80BE-75A886FCFFB3),
    version(1.0),
    helpstring("Real Plagin 1.0 Type Library")
]
library RealPlaginLib
{
    importlib("stdole2.tlb");
    importlib("plagininterface.tlb");

    [
        uuid(29D70F53-9F57-410A-8220-C24EE7AF908E),
        helpstring("Real Plagin Class")
    ]
    coclass RealPlaginCoClass
    {
        [default] interface IPlaginInterface;
    };
};


Так после компиляции этого (последнего ) idl_ника в результирующем tlb некоректно создаеться информация о типе. (TLB не открываеться OleView-ром gbitv E_CANNOT_LOADTYPELIBRARY)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.