Тема: Извлечение tlb из OCX и DLL файлов
Интересует всё что связанно с TLB: методы по извлечению, непосредственное чтение из библиотеки "на лету", и т.д.
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Интересует всё что связанно с TLB: методы по извлечению, непосредственное чтение из библиотеки "на лету", и т.д.
..Или IDL, а не TLB.
В общем суть - Получение списка свойств, методов и событий (а также интерфейсов, констант, и т.д) из ActiveX-контролов.
Это реализовано в: объектных браузерах, средах программирования и некоторых редакторах.
Но "Как?" это осуществляется я лишь догадываюсь...
LoadTypeLib не поможет?
LoadTypeLib не поможет?
А можно поподробнее, что за LoadTypeLib?
----------------------------
Собственно "расковырять" контрол и достать из ресурсов эту самую tlb в бинарном формате труда не составляет. Но это совсем не то.
Вот что я понял:
TLB писан на языке IDL и описывает возможности ActiveX.
TLB содержит некую таблицу смещений именованных процедур. Т.е. (с низкоуровневой точки зрения) при обращении к контролу по имени функции, эта таблица перенаправляет на соответствующий физический адрес (смещение).
Насколько я теперь осведомлён, вся "магия" реализуется через интерфейсы IUnknown и, если имеется - IDispatch.
И копать надо именно туда.
Далее идут интерфейсы ITypeLib и ITypeInfo. Информации о них и работе с ними нашёл мало.
Ну и конечный пункт
ITypeInfo.GetFuncDesc(unsigned int index, FUNCDESC FAR* FAR* ppFuncDesc);
В скриптах единственное, что можно сделать — использовать библиотеку «TLBINF32.DLL» (поставлялась в комплекте с Visual Studio и некоторыми другими продуктами). Я, например, взял библиотеку из Microsoft Office 2000 Disk 1 («.\System\tlbinf32.dll»), скопировал в «%SystemRoot%\System32», зарегистрировал:
regsvr32.exe "%SystemRoot%\System32\tlbinf32.dll"
и пользовался. Документацию к ней можно взять здесь: FILE: Tlbinf32.exe: Справка для Tlbinf32.dll файлов.
Библиотека реализует доступ к Type Library посредством объекта «Tli.TliApplication». Вот Вам простой пример получения списка и регистрации в глобальном пространстве констант из объектов:
Option Explicit
Dim objFSO
Dim objWshShell
Dim objWord
Dim objExcel
Dim objDictionary
Dim strValue
Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
Set objWshShell = WScript.CreateObject("WScript.Shell")
Set objWord = WScript.CreateObject("Word.Application")
Set objExcel = WScript.CreateObject("Excel.Application")
Set objDictionary = WScript.CreateObject("Scripting.Dictionary")
objDictionary.CompareMode = vbTextCompare
DefineConstants objDictionary, objFSO, True
DefineConstants objDictionary, objWshShell, True
DefineConstants objDictionary, objWord, True
DefineConstants objDictionary, objExcel, True
' Здесь, собственно, само тело скрипта — для чего всё и было затеяно.
' А мы, в качестве демонстрации, просто выведем значения некоторых констант
With WScript
.Echo
.Echo "Example of constants"
.Echo "================================"
.Echo "ForReading =", ForReading
.Echo "ForWriting =", ForWriting
.Echo "ForAppending =", ForAppending
.Echo
.Echo "wdNewBlankDocument =", wdNewBlankDocument
.Echo "wdNewWebPage =", wdNewWebPage
.Echo
.Echo "xlAscending =", xlAscending
.Echo "xlDescending =", xlDescending
.Echo "================================"
End With
objExcel.Quit
objWord.Quit
Set objExcel = Nothing
Set objWord = Nothing
Set objWshShell = Nothing
Set objFSO = Nothing
WScript.Quit 0
' ================================================================================
Sub DefineConstants(ByRef objDictionary, objObject, blnDebug)
Dim objTliApplication
Dim objInterfaceInfo
Dim objTypeLibrary
Dim objConstants
Dim objConstant
Dim strTypeLib
Set objTliApplication = WScript.CreateObject("Tli.TliApplication")
Set objInterfaceInfo = objTliApplication.InterfaceInfoFromObject(objObject)
Set objTypeLibrary = objInterfaceInfo.Parent
strTypeLib = "" & vbNewLine & _
"' ==== Type Library ===========================" & vbNewLine & _
"' " & "Name: " & objTypeLibrary.Name & vbNewLine & _
"' " & "Description: " & objTypeLibrary.HelpString & vbNewLine & _
"' " & "GUID: " & objTypeLibrary.GUID & vbNewLine & _
"' " & "Library: " & LCase(objTypeLibrary.ContainingFile) & vbNewLine & _
"' " & "Version: " & objTypeLibrary.MajorVersion & "." & objTypeLibrary.MinorVersion & vbNewLine & _
"' =============================================" & vbNewLine & _
"" & vbNewLine
For Each objConstants In objTypeLibrary.Constants
If Left(objConstants.Name, 1) <> "_" Then
strTypeLib = strTypeLib & "' ---------------------------------------------" & vbNewLine
strTypeLib = strTypeLib & "' " & objConstants.Name & vbNewLine
strTypeLib = strTypeLib & "' ---------------------------------------------" & vbNewLine
For Each objConstant In objConstants.Members
If Left(objConstant.Name, 1) <> "_" Then
If objDictionary.Exists(objConstant.Name) Then
If objDictionary.Item(objConstant.Name) = objConstant.Value Then
If blnDebug Then
strTypeLib = strTypeLib & "' Next constant is duplicate, mark comments" & vbNewLine & _
"' Const " & objConstant.Name & " = " & objConstant.Value & vbNewLine
End If
Else
Err.Raise 1041, "Constant [" & objConstant.Name & "] is duplicate with other " & _
"and constant's value [" & objConstant.Value & "] is different then other [" & objDictionary.Item(objConstant.Name) & "]."
End If
Else
objDictionary.Add objConstant.Name, objConstant.Value
strTypeLib = strTypeLib & "Const " & objConstant.Name & " = " & objConstant.Value & vbNewLine
End If
End If
Next
End If
Next
' Раскомментируйте следующую строку, чтобы увидеть список констант
' При этом желательно работать с консольной версией движка, :)
' WScript.Echo strTypeLib
ExecuteGlobal strTypeLib
Set objConstant = Nothing
Set objTypeLibrary = Nothing
Set objInterfaceInfo = Nothing
Set objTliApplication = Nothing
End Sub
' ================================================================================
Кроме метода «.InterfaceInfoFromObject()» есть и «.TypeLibInfoFromFile()», и «.TypeLibInfoFromRegistry()».
Я все сделал на vbs'е + DynamicWrapperX. У меня цель была подключиться из 1С к событиям com-объекта.
Если интересно, могу выложить код.
По теме - главное, что тебе нужно получить, это интерфейс ITypeLib. Это как раз возвращает LoadTypeLib, вот ее описание:
HRESULT LoadTypeLib(
const OLECHAR FAR *szFile,
ITypeLib FAR* FAR *pptlib
);
Если ITypeLib получен, через него получаешь общее кол-во типов из библиотеке типов и перебираешь их в цикле, получая интерфейс ITypeInfo -
ITypeLib::GetTypeInfo
.
Все остальное получаешь через ITypeInfo, в том числе и
ITypeInfo::GetFuncDesc
Аскет, у тебя конечная цель какая?
alexii, спасибо. Полезная информация. Библиотека имеется, буду разбираться.
Аскет, у тебя конечная цель какая?
Автоматизированное создание документации по COM-объектам.
Я все сделал на vbs'е + DynamicWrapperX. У меня цель была подключиться из 1С к событиям com-объекта.
Если интересно, могу выложить код.
Конечно интересно, выкладывай.
Я думаю будет не лишним в решении задачи.
Упс...а как тут файл прикрепить, а то код дюже большой?
chessman, в этом разделе — никак. Куда-нибудь на файлообменник, сюда — ссылку.
http://narod.ru/disk/4508609001/EventProxy.zip.html
Код написан для 1с 7.7, выкладываю его "как есть", чтобы случайно что-то нужное не удалить.
Думаю, что не проблема будет разобраться что к чему.
Что он делает - подключает события com-объектов к 1С. В процедуру "Источник" приезжает IDispatch объекта, у него я запрашиваю IProvideClassInfo, а через него получаю ITypeInfo - и уже потом работаю с ним.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться