Здравствуйте, 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)