<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Серый форум &mdash; Извлечение tlb из OCX и DLL файлов]]></title>
	<link rel="self" href="http://forum.script-coding.com/extern.php?action=feed&amp;tid=5413&amp;type=atom" />
	<updated>2011-01-28T12:33:01Z</updated>
	<generator>PunBB</generator>
	<id>http://forum.script-coding.com/viewtopic.php?id=5413</id>
		<entry>
			<title type="html"><![CDATA[Re: Извлечение tlb из OCX и DLL файлов]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=44487#p44487" />
			<content type="html"><![CDATA[<p><a href="http://narod.ru/disk/4508609001/EventProxy.zip.html">http://narod.ru/disk/4508609001/EventProxy.zip.html</a></p><p>Код написан для 1с 7.7, выкладываю его &quot;как есть&quot;, чтобы случайно что-то нужное не удалить.<br />Думаю, что не проблема будет разобраться что к чему.</p><p>Что он делает - подключает события com-объектов к 1С. В процедуру &quot;Источник&quot; приезжает IDispatch объекта, у него я запрашиваю IProvideClassInfo, а через него получаю ITypeInfo - и уже потом работаю с ним.</p>]]></content>
			<author>
				<name><![CDATA[chessman]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=25359</uri>
			</author>
			<updated>2011-01-28T12:33:01Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=44487#p44487</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Извлечение tlb из OCX и DLL файлов]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=44472#p44472" />
			<content type="html"><![CDATA[<p><strong>chessman</strong>, в этом разделе — никак. Куда-нибудь на файлообменник, сюда — ссылку.</p>]]></content>
			<author>
				<name><![CDATA[alexii]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=1844</uri>
			</author>
			<updated>2011-01-28T08:20:11Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=44472#p44472</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Извлечение tlb из OCX и DLL файлов]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=44470#p44470" />
			<content type="html"><![CDATA[<p>Упс...а как тут файл прикрепить, а то код дюже большой?</p>]]></content>
			<author>
				<name><![CDATA[chessman]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=25359</uri>
			</author>
			<updated>2011-01-28T06:33:33Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=44470#p44470</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Извлечение tlb из OCX и DLL файлов]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=44453#p44453" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>chessman пишет:</cite><blockquote><p>Я все сделал на vbs&#039;е + DynamicWrapperX.&nbsp; У меня цель была подключиться из 1С к событиям com-объекта.<br />Если интересно, могу выложить код.</p></blockquote></div><p>Конечно интересно, выкладывай. <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" /><br />&nbsp; Я думаю будет не лишним в решении задачи.</p>]]></content>
			<author>
				<name><![CDATA[Аскет]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=25748</uri>
			</author>
			<updated>2011-01-27T15:49:18Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=44453#p44453</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Извлечение tlb из OCX и DLL файлов]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=44452#p44452" />
			<content type="html"><![CDATA[<p><strong>alexii</strong>, спасибо. Полезная информация. Библиотека имеется, буду разбираться.</p><div class="quotebox"><cite>chessman пишет:</cite><blockquote><p><strong>Аскет</strong>, у тебя конечная цель какая?</p></blockquote></div><p>Автоматизированное создание документации по COM-объектам.</p>]]></content>
			<author>
				<name><![CDATA[Аскет]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=25748</uri>
			</author>
			<updated>2011-01-27T15:42:20Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=44452#p44452</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Извлечение tlb из OCX и DLL файлов]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=44443#p44443" />
			<content type="html"><![CDATA[<p>Я все сделал на vbs&#039;е + DynamicWrapperX.&nbsp; У меня цель была подключиться из 1С к событиям com-объекта.<br />Если интересно, могу выложить код.</p><p>По теме - главное, что тебе нужно получить, это интерфейс ITypeLib. Это как раз возвращает LoadTypeLib, вот ее описание:</p><div class="codebox"><pre><code>HRESULT LoadTypeLib(  
  const OLECHAR FAR  *szFile,       
  ITypeLib FAR* FAR  *pptlib  
);</code></pre></div><p>Если ITypeLib получен, через него получаешь общее кол-во типов из библиотеке типов и перебираешь их в цикле, получая интерфейс ITypeInfo - </p><div class="codebox"><pre><code>ITypeLib::GetTypeInfo</code></pre></div><p>.<br />Все остальное получаешь через ITypeInfo, в том числе и </p><div class="codebox"><pre><code>ITypeInfo::GetFuncDesc</code></pre></div><p><strong>Аскет</strong>, у тебя конечная цель какая?</p>]]></content>
			<author>
				<name><![CDATA[chessman]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=25359</uri>
			</author>
			<updated>2011-01-27T06:55:04Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=44443#p44443</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Извлечение tlb из OCX и DLL файлов]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=44438#p44438" />
			<content type="html"><![CDATA[<p>В скриптах единственное, что можно сделать — использовать библиотеку «TLBINF32.DLL» (поставлялась в комплекте с Visual Studio и некоторыми другими продуктами). Я, например, взял библиотеку из Microsoft Office 2000 Disk 1 («.\System\tlbinf32.dll»), скопировал в «%SystemRoot%\System32», зарегистрировал:<br /></p><div class="codebox"><pre><code>regsvr32.exe &quot;%SystemRoot%\System32\tlbinf32.dll&quot;</code></pre></div><p>и пользовался. Документацию к ней можно взять здесь: <a href="http://support.microsoft.com/kb/224331/en-us">FILE: Tlbinf32.exe: Справка для Tlbinf32.dll файлов</a>.</p><p>Библиотека реализует доступ к Type Library посредством объекта «Tli.TliApplication». Вот Вам простой пример получения списка и регистрации в глобальном пространстве констант из объектов:<br /></p><div class="codebox"><pre><code>Option Explicit

Dim objFSO
Dim objWshShell
Dim objWord
Dim objExcel

Dim objDictionary

Dim strValue

Set objFSO            = WScript.CreateObject(&quot;Scripting.FileSystemObject&quot;)
Set objWshShell        = WScript.CreateObject(&quot;WScript.Shell&quot;)
Set objWord            = WScript.CreateObject(&quot;Word.Application&quot;)
Set objExcel        = WScript.CreateObject(&quot;Excel.Application&quot;)

Set objDictionary    = WScript.CreateObject(&quot;Scripting.Dictionary&quot;)
objDictionary.CompareMode = vbTextCompare

DefineConstants objDictionary, objFSO, True
DefineConstants objDictionary, objWshShell, True
DefineConstants objDictionary, objWord, True
DefineConstants objDictionary, objExcel, True

&#039; Здесь, собственно, само тело скрипта — для чего всё и было затеяно.
&#039; А мы, в качестве демонстрации, просто выведем значения некоторых констант

With WScript
    .Echo
    .Echo &quot;Example of constants&quot;
    .Echo &quot;================================&quot;
    .Echo &quot;ForReading =&quot;, ForReading
    .Echo &quot;ForWriting =&quot;, ForWriting
    .Echo &quot;ForAppending =&quot;, ForAppending
    .Echo
    .Echo &quot;wdNewBlankDocument =&quot;, wdNewBlankDocument
    .Echo &quot;wdNewWebPage =&quot;, wdNewWebPage
    .Echo
    .Echo &quot;xlAscending =&quot;, xlAscending
    .Echo &quot;xlDescending =&quot;, xlDescending
    .Echo &quot;================================&quot;
End With

objExcel.Quit
objWord.Quit

Set objExcel = Nothing
Set objWord = Nothing
Set objWshShell = Nothing
Set objFSO = Nothing

WScript.Quit 0

&#039; ================================================================================
Sub DefineConstants(ByRef objDictionary, objObject, blnDebug)
    Dim objTliApplication
    Dim objInterfaceInfo
    Dim objTypeLibrary
    Dim objConstants
    Dim objConstant
    
    Dim strTypeLib

    Set objTliApplication = WScript.CreateObject(&quot;Tli.TliApplication&quot;)
    Set objInterfaceInfo = objTliApplication.InterfaceInfoFromObject(objObject)
    Set objTypeLibrary = objInterfaceInfo.Parent
    
    strTypeLib = &quot;&quot; &amp; vbNewLine &amp; _
        &quot;&#039; ==== Type Library ===========================&quot; &amp; vbNewLine &amp; _
        &quot;&#039; &quot; &amp; &quot;Name:        &quot; &amp; objTypeLibrary.Name &amp; vbNewLine &amp; _
        &quot;&#039; &quot; &amp; &quot;Description: &quot; &amp; objTypeLibrary.HelpString &amp; vbNewLine &amp; _
        &quot;&#039; &quot; &amp; &quot;GUID:        &quot; &amp; objTypeLibrary.GUID &amp; vbNewLine &amp; _
        &quot;&#039; &quot; &amp; &quot;Library:     &quot; &amp; LCase(objTypeLibrary.ContainingFile) &amp; vbNewLine &amp; _
        &quot;&#039; &quot; &amp; &quot;Version:     &quot; &amp; objTypeLibrary.MajorVersion &amp; &quot;.&quot; &amp; objTypeLibrary.MinorVersion &amp; vbNewLine &amp; _
        &quot;&#039; =============================================&quot; &amp; vbNewLine &amp; _
        &quot;&quot; &amp; vbNewLine
    
    For Each objConstants In objTypeLibrary.Constants
        If Left(objConstants.Name, 1) &lt;&gt; &quot;_&quot; Then
            strTypeLib = strTypeLib &amp; &quot;&#039; ---------------------------------------------&quot; &amp; vbNewLine
            strTypeLib = strTypeLib &amp; &quot;&#039; &quot; &amp; objConstants.Name &amp; vbNewLine
            strTypeLib = strTypeLib &amp; &quot;&#039; ---------------------------------------------&quot; &amp; vbNewLine
            
            For Each objConstant In objConstants.Members
                If Left(objConstant.Name, 1) &lt;&gt; &quot;_&quot; Then
                    If objDictionary.Exists(objConstant.Name) Then
                        If objDictionary.Item(objConstant.Name) = objConstant.Value Then
                            If blnDebug Then
                                strTypeLib = strTypeLib &amp; &quot;&#039; Next constant is duplicate, mark comments&quot; &amp; vbNewLine &amp; _
                                &quot;&#039; Const &quot; &amp; objConstant.Name &amp; &quot; = &quot; &amp; objConstant.Value &amp; vbNewLine
                            End If
                        Else
                            Err.Raise 1041, &quot;Constant [&quot; &amp; objConstant.Name &amp; &quot;] is duplicate with other &quot; &amp; _
                                &quot;and constant&#039;s value [&quot; &amp; objConstant.Value &amp; &quot;] is different then other [&quot; &amp; objDictionary.Item(objConstant.Name) &amp; &quot;].&quot;
                        End If
                    Else
                        objDictionary.Add objConstant.Name, objConstant.Value
                        strTypeLib = strTypeLib &amp; &quot;Const &quot; &amp; objConstant.Name &amp; &quot; = &quot; &amp; objConstant.Value &amp; vbNewLine
                    End If
                End If
            Next
        End If
    Next
    
    &#039; Раскомментируйте следующую строку, чтобы увидеть список констант
    &#039; При этом желательно работать с консольной версией движка, :)
    &#039; WScript.Echo strTypeLib
    
    ExecuteGlobal strTypeLib

    Set objConstant = Nothing
    Set objTypeLibrary = Nothing
    Set objInterfaceInfo = Nothing
    Set objTliApplication = Nothing
End Sub
&#039; ================================================================================</code></pre></div><p>Кроме метода «.InterfaceInfoFromObject()» есть и «.TypeLibInfoFromFile()», и «.TypeLibInfoFromRegistry()».</p>]]></content>
			<author>
				<name><![CDATA[alexii]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=1844</uri>
			</author>
			<updated>2011-01-26T19:37:32Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=44438#p44438</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Извлечение tlb из OCX и DLL файлов]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=44436#p44436" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>chessman пишет:</cite><blockquote><p>LoadTypeLib не поможет?</p></blockquote></div><p>А можно поподробнее, что за <strong>LoadTypeLib</strong>?</p><p>----------------------------<br />Собственно &quot;расковырять&quot; контрол и достать из ресурсов эту самую tlb <span class="bbu">в бинарном формате</span> труда не составляет. Но это совсем не то.</p><p>Вот что я понял:<br />TLB писан на языке IDL и описывает возможности ActiveX.<br />TLB содержит некую таблицу смещений именованных процедур. Т.е. (с низкоуровневой точки зрения) при обращении к контролу по имени функции, эта таблица перенаправляет на соответствующий физический адрес (смещение).</p><p>Насколько я теперь осведомлён, вся &quot;магия&quot; реализуется через интерфейсы <strong>IUnknown</strong> и, если имеется - <strong>IDispatch</strong>.<br /> И копать надо именно туда.</p><p>Далее идут интерфейсы <strong>ITypeLib</strong> и&nbsp; <strong>ITypeInfo</strong>. Информации о них и работе с ними нашёл мало.</p><p>Ну и конечный пункт </p><div class="quotebox"><blockquote><p><strong>ITypeInfo.GetFuncDesc</strong><em>(unsigned int index, FUNCDESC FAR* FAR* ppFuncDesc)</em>;</p></blockquote></div>]]></content>
			<author>
				<name><![CDATA[Аскет]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=25748</uri>
			</author>
			<updated>2011-01-26T17:43:57Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=44436#p44436</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Извлечение tlb из OCX и DLL файлов]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=44423#p44423" />
			<content type="html"><![CDATA[<p>LoadTypeLib не поможет?</p>]]></content>
			<author>
				<name><![CDATA[chessman]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=25359</uri>
			</author>
			<updated>2011-01-26T13:45:37Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=44423#p44423</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Извлечение tlb из OCX и DLL файлов]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=44355#p44355" />
			<content type="html"><![CDATA[<p>..Или <strong>IDL</strong>, а не TLB. </p><p>В общем суть - Получение списка <strong>свойств</strong>, <strong>методов</strong> и <strong>событий</strong> (а также интерфейсов, констант, и т.д) из ActiveX-контролов.</p><p>Это реализовано в: объектных браузерах, средах программирования и некоторых редакторах.<br />Но &quot;Как?&quot; это осуществляется я лишь догадываюсь...</p>]]></content>
			<author>
				<name><![CDATA[Аскет]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=25748</uri>
			</author>
			<updated>2011-01-23T14:38:42Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=44355#p44355</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Извлечение tlb из OCX и DLL файлов]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=44309#p44309" />
			<content type="html"><![CDATA[<p>Интересует всё что связанно с TLB: методы по извлечению, непосредственное чтение из библиотеки &quot;на лету&quot;, и т.д.</p>]]></content>
			<author>
				<name><![CDATA[Аскет]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=25748</uri>
			</author>
			<updated>2011-01-22T23:55:38Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=44309#p44309</id>
		</entry>
</feed>
