Архитектура Plug-in в концепции СOM
От: Аноним  
Дата: 22.04.04 07:38
Оценка:
Здравствуйте!

Хочу спректировать проект — экзешника с подключаемыми к нему плагинами.
Плагины — это коклассы входящие в некоторую COM категорию (CATID_plagins).
Плагин обладает некоторым интерфейсовм IPlaginInterface

В связи с этим два вопроса

1. COM категория описываеться Guid-ом. Сейчас этот гуид нахожиться просто в .h файле. И для разных плагинов (которые например находяться в разных DLL файлах) мне приходиться "таскать" его за собой. Это неправильно. (Если я на VB или Java писать плагин буду?). Соответсвенно как этот GUID СOM-категории занести в TLB фай, или существует еще какониудь механизм.

2. Интерфейс IPlaginInterface объявляетсья в IDL файле. Соответсвенно я могу этот IDL импортить и создавать коклассы (Плагины) которые его реализуют. Но опять — это не совсем корректный подход — ведь некоторые языки не поддерживают IDL в чистом виде, а в TLB интерфейс не попадает (надеюсь поянтно почему). Как грамотно определять интерфейсы, чтобы их можно было реализовывать из разных языков?
Re: Архитектура Plug-in в концепции СOM
От: algol Россия about:blank
Дата: 22.04.04 07:51
Оценка:
Здравствуйте, Аноним, Вы писали:

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


Можно определить IPlaginInterface в основном приложении, если там есть TLB, или скомпилировать отдельную TLB. Это можно сделать .bat файлом:
call vcvars32.bat
midl myplagin.idl
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)
Re[3]: Архитектура Plug-in в концепции СOM
От: Vi2 Удмуртия http://www.adem.ru
Дата: 22.04.04 08:27
Оценка:
Здравствуйте, Аноним, Вы писали:

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

В этом нет ничего странного. TLB — это Type Library. Поэтому это именно описание Библиотеки Типов.

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

Как правило, приложение, которое использует плагины, само регистрирует такую TLB — TLB с интерфейсом плагина, с константами и прочей лабудой. В частности, для того, чтобы маршаллить этот интерфейс для каждого плагина.

Поэтому это проблема приложения — верно зарегистрировать TLB (или отдельно как plagininterface.tlb, или в составе сервера plagininterface.exe).

Проблема проекта плагина — предоставить информацию для разрешения фразы importlib("plagininterface.tlb"); по путям.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[4]: Архитектура Plug-in в концепции СOM
От: sashkamaslukov  
Дата: 22.04.04 10:10
Оценка:
Здравствуйте, Vi2, Вы писали:

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


Vi2>

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

Vi2>В этом нет ничего странного. TLB — это Type Library. Поэтому это именно описание Библиотеки Типов.

Vi2>

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

Vi2>Как правило, приложение, которое использует плагины, само регистрирует такую TLB — TLB с интерфейсом плагина, с константами и прочей лабудой. В частности, для того, чтобы маршаллить этот интерфейс для каждого плагина.

Vi2>Поэтому это проблема приложения — верно зарегистрировать TLB (или отдельно как plagininterface.tlb, или в составе сервера plagininterface.exe).


Vi2>Проблема проекта плагина — предоставить информацию для разрешения фразы importlib("plagininterface.tlb"); по путям.



окей- все понял. Но:
1.Где же всетакие ГУИД категории объявить? в IDL нельзя же просто ГУИД внести.

2.по путям это как? пускай я делаю так
library RealPlaginLib
{

    importlib("stdole2.tlb");
    importlib("c:\plagininterface.tlb");
    [
        uuid(0F4E4F63-CF65-4C8B-AE74-6EB417402B8F),
        helpstring("Real plagin Class")
    ]
    coclass RealPluginCoClass
    {
        [default] interface IPlaginInterface;
    };
};


После компиляции в TLB OleView не может получить из него информацию...
TYPE_E_ELEMENTNOTFOUND. хотя plagininterafce.tlb лежит на C:\.
что то здесь не то...
Re[5]: Архитектура Plug-in в концепции СOM
От: Vi2 Удмуртия http://www.adem.ru
Дата: 22.04.04 10:25
Оценка:
Здравствуйте, sashkamaslukov, Вы писали:

S>1.Где же все-таки ГУИД категории объявить? в IDL нельзя же просто ГУИД внести.

Не знаю. Но просто так этот GUID не задать, его нужно соотносить с какой-то более значимой информацией в IDL. С тем, что имеет в IDL атрибут uuid.

S>После компиляции в TLB OleView не может получить из него информацию...
S>TYPE_E_ELEMENTNOTFOUND. хотя plagininterafce.tlb лежит на C:\.
S>что то здесь не то...

OleView это не показатель. Он много чего не может. Но я же вроде написал, что эта TLB должна быть зарегистрирована приложением. Допустим, через regtlib.

В RealPlaginLib.TLB вносится информация об используемой plagininterface.tlb, но не через имя, а через LIBID_IPlaginLib (= 89F9B3D3-4FFB-4c28-8FDD-035D4C210509), потому что каждая библиотека имеет свой GUID. Также и номер версии. И эта библиотека подгружается именно по этой информации и состояния Реестра. Нет в Реестре, нет нигде.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[6]: Архитектура Plug-in в концепции СOM
От: sashkamaslukov  
Дата: 22.04.04 10:45
Оценка:
Здравствуйте, Vi2, Вы писали:

Vi2>Здравствуйте, sashkamaslukov, Вы писали:


Vi2>

S>>1.Где же все-таки ГУИД категории объявить? в IDL нельзя же просто ГУИД внести.

Vi2>Не знаю. Но просто так этот GUID не задать, его нужно соотносить с какой-то более значимой информацией в IDL. С тем, что имеет в IDL атрибут uuid.



Vi2>

S>>После компиляции в TLB OleView не может получить из него информацию...
S>>TYPE_E_ELEMENTNOTFOUND. хотя plagininterafce.tlb лежит на C:\.
S>>что то здесь не то...

Vi2>OleView это не показатель. Он много чего не может. Но я же вроде написал, что эта TLB должна быть зарегистрирована приложением. Допустим, через regtlib.

Vi2>В RealPlaginLib.TLB вносится информация об используемой plagininterface.tlb, но не через имя, а через LIBID_IPlaginLib (= 89F9B3D3-4FFB-4c28-8FDD-035D4C210509), потому что каждая библиотека имеет свой GUID. Также и номер версии. И эта библиотека подгружается именно по этой информации и состояния Реестра. Нет в Реестре, нет нигде.


Понял спасибо большое. Только одна проблема — не могу найти regtlb.exe перерыл весь компьютер...
возможно она идет в наборе с какимнибуль ServicePack-ом? Можно регистрировать программно (пойду гляну в msdn). Еще раз спасибо
Re[7]: Архитектура Plug-in в концепции СOM
От: algol Россия about:blank
Дата: 22.04.04 10:54
Оценка:
Здравствуйте, sashkamaslukov, Вы писали:

S> Только одна проблема — не могу найти regtlb.exe перерыл весь компьютер...


Я для этого юзаю бесплатный vbClarity ActiveX Properties Shell Extension — добавляет для ocx, dll, tlb страницу свойств с информацией о TypeLib.
Re[7]: Regtlib
От: Vi2 Удмуртия http://www.adem.ru
Дата: 22.04.04 11:20
Оценка:
Здравствуйте, sashkamaslukov, Вы писали:

S>Только одна проблема — не могу найти regtlb.exe перерыл весь компьютер...

windows\regtlIb.exe

PS
И, пожалйста, не оверквоть. Цитируй только нужное.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[8]: Regtlib
От: sashkamaslukov  
Дата: 22.04.04 12:21
Оценка:
Здравствуйте, Vi2, Вы писали:

Vi2>Здравствуйте, sashkamaslukov, Вы писали:


Vi2>

S>>Только одна проблема — не могу найти regtlb.exe перерыл весь компьютер...

Vi2>windows\regtlIb.exe

Vi2>PS

Vi2>И, пожалйста, не оверквоть. Цитируй только нужное.

В windows xp в поставке не идет. Нашел в .CAB-ах IE6-го... возможно он использует его (Regtlib.exe) для регистрации — потом прибивает. По умолчанию MIDL посел коспиляции IDL в TLB также прописывает ее в реестре (если еще не прописана.)
Спасибо большое — со всем разобрался.

насчет ГУИДА категории буду думать...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.