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

Полезные статьи и переводы интересных статей
alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

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

Сообщение alibek » 29.12.2004 (Ср) 15:09

Оригинал статьи: 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.


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

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 31.12.2004 (Пт) 14:27

Ввиду того, что Переводчик ушёл на праздники, я таки-прокомментирую эту статью.

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

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

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

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 31.12.2004 (Пт) 14:31

Мммм.... да, но выражу-таки свой восторг, возникший при первом прочтении статьи :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 11.01.2005 (Вт) 8:17

Мой первый пост после праздников :)
Насчет замечания tyomitch скажу так. Согласен, разве что поспорю насчет "очень редко" :) Во всяком случае в самом VB (в виртуальной машине) использован именно этот подход -- MSVBVM60.DLL\3 это "Visual Basic runtime objects and procedures".
Lasciate ogni speranza, voi ch'entrate.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 11.01.2005 (Вт) 9:53

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


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

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 11.01.2005 (Вт) 12:11

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

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 11.01.2005 (Вт) 16:43

"Юзает" в значении "внутри себя" или "принимает параметром"? Если только внутри себя (например, для работы с API), то скомпилированному приложению TLB не нужна. Если принимает параметром - то нужны.
Изображение

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 11.01.2005 (Вт) 16:54

Да, именно даёт на экспорт. В этом случае они перепишутся в её tlb?
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 11.01.2005 (Вт) 16:57

Нет, в этом случае нужно тащить ещё и ту TLB.
Изображение

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 11.01.2005 (Вт) 16:58

А если тащить её в ресурсах, как предлагает афтар, то как она будет заюзана клиентским приложением? Будет ли достаточно просто засунуть её в ресурсы, VB разберётся?
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 11.01.2005 (Вт) 17:21

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


Вернуться в VBStreets Knowledge Base

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5

    TopList