Страница 1 из 1

KB122285 - добавление библиотеки типов (.tlb) в ресурсы

СообщениеДобавлено: 29.12.2004 (Ср) 15:09
alibek
Оригинал статьи: http://support.microsoft.com/default.as ... -us;122285

Перевод мой.

Как добавить библиотеку типов в виде ресурса к .dll или .exe файлу

ID статьи : 122285
Дата обновления : 29 июня 2004
Ревизия : 1.0


Вы можете добавить библиотеку типов (.tlb) как ресурс .exe или .dll файла используя следующий оператор в ресурсном (.rc) файле:
Код: Выделить всё
1 typelib Test.tlb

В этом примере в ресурсы будет добавлена библиотека типов Test.tlb.

Когда библиотека типов добавлена в ресурсы, для приложения не требуется отдельный файл библиотеки типов. Для загрузки существующей в ресурсах библиотеки типов из .exe или .dll файла вы можете использовать функции LoadTypeLib() и LoadRegTypeLib().

Примечание: Для чтения библиотеки типов из .exe файла требуется OLE с версией 2.02 или выше.


Любой .exe или .dll файл может содержать несколько библиотек типов в ресурсах. Для примера:
Код: Выделить всё
1 typelib Test1.tlb
2 typelib Test2.tlb

В ресурсы будут включены две библиотеки типов, Test1.tlb и Test2.tlb.

По умолчанию, функция LoadTypeLib извлекает библиотеку типов из первого ресурса, имеющего тип typelib. Для того, чтобы загрузить другую библиотеку типов, добавьте целый индекс к параметру szFileName функции LoadTypeLib. Для примера:
Код: Выделить всё
LoadTypeLib(OLESTR("c:\\test.exe\\2"), &ptlib);

Код: Выделить всё
Call LoadTypeLib("c:\test.exe\2"), pLib&)

Этот оператор (первый пример для C, второй для VB) загрузить вторую библиотеку типов из Test.exe.


Комментарии от переводчика:
Данная статья полезна для тех, кто использует библиотеки типов, но не хочет, чтобы для работы программы требовались дополнительные файлы, помимо исполняемого.

СообщениеДобавлено: 31.12.2004 (Пт) 14:27
tyomitch
Ввиду того, что Переводчик ушёл на праздники, я таки-прокомментирую эту статью.

В большинстве случаев тащить используемые TLB вслед за прогой не нужно. Это нужно только тогда, когда прога - это ActiveX-компонент, использующий в своём интерфейсе (как параметр или возвращаемое значение) тип, объявленный в TLB.
В частности, для Standard EXE TLB не нужно вообще никогда.

Поскольку большинство применений TLB в прогах на VB относятся именно к реализации, а не к интерфейсу (напр., объявления API, констант, VB-friendly интерфейсов и т.д.), то описанный в статье приём очень редко может оказаться полезным на практике.

Дизклеймер: это не флейм! Если уважаемые модераторы посчитают нужным удалить этот пост, как они это сделали с предыдущим, то пусть сначала согласуют это с alibek-ом как автором топика - возможно, он всё-таки сочтёт этот комментарий ценным.

СообщениеДобавлено: 31.12.2004 (Пт) 14:31
GSerg
Мммм.... да, но выражу-таки свой восторг, возникший при первом прочтении статьи :)

СообщениеДобавлено: 11.01.2005 (Вт) 8:17
alibek
Мой первый пост после праздников :)
Насчет замечания tyomitch скажу так. Согласен, разве что поспорю насчет "очень редко" :) Во всяком случае в самом VB (в виртуальной машине) использован именно этот подход -- MSVBVM60.DLL\3 это "Visual Basic runtime objects and procedures".

СообщениеДобавлено: 11.01.2005 (Вт) 9:53
tyomitch
Не вижу связи... VB в ресурсе тащит TLB для своих объектов. Любой скомпилированный в VB ActiveX-компонент тоже имеет в ресурсах сгенерированную VB TLB для своих объектов.
Ты предлагаешь добавить к ней ещё и TLB для чужих объектов. Зачем? :-?


И с прошедшими тебя праздниками :-)

СообщениеДобавлено: 11.01.2005 (Вт) 12:11
GSerg
Не пробовал, но спрошу.
Тёмыч, вот если я ручками пишу tlb с некими типами (допустим, хочу заставить VB работать со струтурами 1-байтного паддинга) и создаю ActiveX dll, которая юзает эту tlb, то что получается: что моя dll перепишет в себя эти описания, и тогда ничего кроме неё не потребуется, или что придётся таскать вместе с моей dll ещё и tlb, на которой моя базируется?

СообщениеДобавлено: 11.01.2005 (Вт) 16:43
tyomitch
"Юзает" в значении "внутри себя" или "принимает параметром"? Если только внутри себя (например, для работы с API), то скомпилированному приложению TLB не нужна. Если принимает параметром - то нужны.

СообщениеДобавлено: 11.01.2005 (Вт) 16:54
GSerg
Да, именно даёт на экспорт. В этом случае они перепишутся в её tlb?

СообщениеДобавлено: 11.01.2005 (Вт) 16:57
tyomitch
Нет, в этом случае нужно тащить ещё и ту TLB.

СообщениеДобавлено: 11.01.2005 (Вт) 16:58
GSerg
А если тащить её в ресурсах, как предлагает афтар, то как она будет заюзана клиентским приложением? Будет ли достаточно просто засунуть её в ресурсы, VB разберётся?

СообщениеДобавлено: 11.01.2005 (Вт) 17:21
tyomitch
Думаю, не разберётся :-(
Вариант "для экстремалов" - декомпильнуть ту TLB, что положил в ресурсы VB, добавить туда свой тип, скомпилировать и положить обратно.
И так при каждой компиляции...