Хочу спректировать проект — экзешника с подключаемыми к нему плагинами.
Плагины — это коклассы входящие в некоторую COM категорию (CATID_plagins).
Плагин обладает некоторым интерфейсовм IPlaginInterface
В связи с этим два вопроса
1. COM категория описываеться Guid-ом. Сейчас этот гуид нахожиться просто в .h файле. И для разных плагинов (которые например находяться в разных DLL файлах) мне приходиться "таскать" его за собой. Это неправильно. (Если я на VB или Java писать плагин буду?). Соответсвенно как этот GUID СOM-категории занести в TLB фай, или существует еще какониудь механизм.
2. Интерфейс IPlaginInterface объявляетсья в IDL файле. Соответсвенно я могу этот IDL импортить и создавать коклассы (Плагины) которые его реализуют. Но опять — это не совсем корректный подход — ведь некоторые языки не поддерживают IDL в чистом виде, а в TLB интерфейс не попадает (надеюсь поянтно почему). Как грамотно определять интерфейсы, чтобы их можно было реализовывать из разных языков?
Здравствуйте, Аноним, Вы писали:
А>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_ника в результирующем tlb некоректно создаеться информация о типе. (TLB не открываеться OleView-ром gbitv E_CANNOT_LOADTYPELIBRARY)
А>Эта IDL должна содержать library секцию (потому как без нее tlb будет пустой).
А>эта несколько странно ( ведь обычно интерфейс не привязан к библиотеке типов? или я не прав)
В этом нет ничего странного. TLB — это Type Library. Поэтому это именно описание Библиотеки Типов.
А>Так после компиляции этого (последнего ) idl_ника в результирующем tlb некоректно создаеться информация о типе. (TLB не открываеться OleView-ром gbitv E_CANNOT_LOADTYPELIBRARY)
Как правило, приложение, которое использует плагины, само регистрирует такую TLB — TLB с интерфейсом плагина, с константами и прочей лабудой. В частности, для того, чтобы маршаллить этот интерфейс для каждого плагина.
Поэтому это проблема приложения — верно зарегистрировать TLB (или отдельно как plagininterface.tlb, или в составе сервера plagininterface.exe).
Проблема проекта плагина — предоставить информацию для разрешения фразы importlib("plagininterface.tlb"); по путям.
Здравствуйте, 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 нельзя же просто ГУИД внести.
После компиляции в TLB OleView не может получить из него информацию...
TYPE_E_ELEMENTNOTFOUND. хотя plagininterafce.tlb лежит на C:\.
что то здесь не то...
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. Также и номер версии. И эта библиотека подгружается именно по этой информации и состояния Реестра. Нет в Реестре, нет нигде.
Здравствуйте, 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). Еще раз спасибо
Здравствуйте, Vi2, Вы писали:
Vi2>Здравствуйте, sashkamaslukov, Вы писали:
Vi2>
S>>Только одна проблема — не могу найти regtlb.exe перерыл весь компьютер...
Vi2>windows\regtlIb.exe
Vi2>PS Vi2>И, пожалйста, не оверквоть. Цитируй только нужное.
В windows xp в поставке не идет. Нашел в .CAB-ах IE6-го... возможно он использует его (Regtlib.exe) для регистрации — потом прибивает. По умолчанию MIDL посел коспиляции IDL в TLB также прописывает ее в реестре (если еще не прописана.)
Спасибо большое — со всем разобрался.