1

Тема: Извлечение tlb из OCX и DLL файлов

Интересует всё что связанно с TLB: методы по извлечению, непосредственное чтение из библиотеки "на лету", и т.д.

2

Re: Извлечение tlb из OCX и DLL файлов

..Или IDL, а не TLB.

В общем суть - Получение списка свойств, методов и событий (а также интерфейсов, констант, и т.д) из ActiveX-контролов.

Это реализовано в: объектных браузерах, средах программирования и некоторых редакторах.
Но "Как?" это осуществляется я лишь догадываюсь...

3

Re: Извлечение tlb из OCX и DLL файлов

LoadTypeLib не поможет?

4

Re: Извлечение tlb из OCX и DLL файлов

chessman пишет:

LoadTypeLib не поможет?

А можно поподробнее, что за LoadTypeLib?

----------------------------
Собственно "расковырять" контрол и достать из ресурсов эту самую tlb в бинарном формате труда не составляет. Но это совсем не то.

Вот что я понял:
TLB писан на языке IDL и описывает возможности ActiveX.
TLB содержит некую таблицу смещений именованных процедур. Т.е. (с низкоуровневой точки зрения) при обращении к контролу по имени функции, эта таблица перенаправляет на соответствующий физический адрес (смещение).

Насколько я теперь осведомлён, вся "магия" реализуется через интерфейсы IUnknown и, если имеется - IDispatch.
И копать надо именно туда.

Далее идут интерфейсы ITypeLib и  ITypeInfo. Информации о них и работе с ними нашёл мало.

Ну и конечный пункт

ITypeInfo.GetFuncDesc(unsigned int index, FUNCDESC FAR* FAR* ppFuncDesc);

5

Re: Извлечение tlb из OCX и DLL файлов

В скриптах единственное, что можно сделать — использовать библиотеку «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()».

6 (изменено: chessman, 2011-01-27 10:58:51)

Re: Извлечение tlb из OCX и DLL файлов

Я все сделал на vbs'е + DynamicWrapperX.  У меня цель была подключиться из 1С к событиям com-объекта.
Если интересно, могу выложить код.

По теме - главное, что тебе нужно получить, это интерфейс ITypeLib. Это как раз возвращает LoadTypeLib, вот ее описание:

HRESULT LoadTypeLib(  
  const OLECHAR FAR  *szFile,       
  ITypeLib FAR* FAR  *pptlib  
);

Если ITypeLib получен, через него получаешь общее кол-во типов из библиотеке типов и перебираешь их в цикле, получая интерфейс ITypeInfo -

ITypeLib::GetTypeInfo

.
Все остальное получаешь через ITypeInfo, в том числе и

ITypeInfo::GetFuncDesc

Аскет, у тебя конечная цель какая?

7

Re: Извлечение tlb из OCX и DLL файлов

alexii, спасибо. Полезная информация. Библиотека имеется, буду разбираться.

chessman пишет:

Аскет, у тебя конечная цель какая?

Автоматизированное создание документации по COM-объектам.

8

Re: Извлечение tlb из OCX и DLL файлов

chessman пишет:

Я все сделал на vbs'е + DynamicWrapperX.  У меня цель была подключиться из 1С к событиям com-объекта.
Если интересно, могу выложить код.

Конечно интересно, выкладывай.
  Я думаю будет не лишним в решении задачи.

9

Re: Извлечение tlb из OCX и DLL файлов

Упс...а как тут файл прикрепить, а то код дюже большой?

10

Re: Извлечение tlb из OCX и DLL файлов

chessman, в этом разделе — никак. Куда-нибудь на файлообменник, сюда — ссылку.

11

Re: Извлечение tlb из OCX и DLL файлов

http://narod.ru/disk/4508609001/EventProxy.zip.html

Код написан для 1с 7.7, выкладываю его "как есть", чтобы случайно что-то нужное не удалить.
Думаю, что не проблема будет разобраться что к чему.

Что он делает - подключает события com-объектов к 1С. В процедуру "Источник" приезжает IDispatch объекта, у него я запрашиваю IProvideClassInfo, а через него получаю ITypeInfo - и уже потом работаю с ним.