<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Серый форум &mdash; JScript/VBScript & Win32: расширение возможностей DynamicWrapperX]]></title>
	<link rel="self" href="http://forum.script-coding.com/extern.php?action=feed&amp;tid=5341&amp;type=atom" />
	<updated>2011-05-20T12:09:25Z</updated>
	<generator>PunBB</generator>
	<id>http://forum.script-coding.com/viewtopic.php?id=5341</id>
		<entry>
			<title type="html"><![CDATA[Re: JScript/VBScript & Win32: расширение возможностей DynamicWrapperX]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=48547#p48547" />
			<content type="html"><![CDATA[<p>Объединил скрипт с родной DLL. <br />Собирал руками - поэтому возможны глюки.</p>]]></content>
			<author>
				<name><![CDATA[chessman]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=25359</uri>
			</author>
			<updated>2011-05-20T12:09:25Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=48547#p48547</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: JScript/VBScript & Win32: расширение возможностей DynamicWrapperX]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=43886#p43886" />
			<content type="html"><![CDATA[<p>Добавлено еще 2 встроенных метода:<br />1. GetIDispatch(&lt;Объект&gt;) возвращает указатель на объект - адрес памяти.</p><div class="codebox"><pre><code>Outlook = СоздатьОбъект(&quot;Outlook.Application&quot;);
pObj = Wrap.GetIDispatch(Outlook);</code></pre></div><p>2.GetObject(&lt;адрес&gt;) по указателю на объект возвращает объект. Метод вызывает AddRef объекта.</p><div class="codebox"><pre><code>Obj = Wrap.GetObject(pObj)</code></pre></div><p>Примеры приведены для 1С, но смысл я думаю понятен.</p>]]></content>
			<author>
				<name><![CDATA[chessman]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=25359</uri>
			</author>
			<updated>2011-01-16T19:49:51Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=43886#p43886</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[JScript/VBScript & Win32: расширение возможностей DynamicWrapperX]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=43318#p43318" />
			<content type="html"><![CDATA[<p>Данный скрипт расширяет возможности объекта <a href="http://forum.script-coding.com/viewtopic.php?id=2214">DynamicWrapperX</a>, а именно:</p><p><strong>1.</strong> Добавляет новый встроенный метод RegisterAddr. Первый параметр - адрес памяти, остальные параметры, как у метода Register.<br /></p><div class="codebox"><pre><code>RegisterAddr( Addr, FuncName [, i=ParamTypes] [, r=RetValType] )</code></pre></div><p>Этот метод &quot;именует&quot; участок кода в виртуальном пространстве процесса. Это позволяет, например, сделать ассемблерную вставку из скрипта и напрямую обратиться к ней. Кроме этого, это позволяет обратится к &quot;кривым&quot; экспортным функциям (&quot;?GetBkEndUI@@YAPAVCBkEndUI@@XZ&quot;) и к функциям экспортируемым по ординалу.</p><p>Пример:<br /></p><div class="codebox"><pre><code>handle = Wrap.LoadLibrary(&quot;&quot;BkEnd&quot;&quot;)
Addr   = Wrap.GetProcAddress(handle, &quot;&quot;?GetBkEndUI@@YAPAVCBkEndUI@@XZ&quot;&quot;)     &#039;class CBkEndUI * __cdecl GetBkEndUI(void)    
Wrap.RegisterAddr Addr, &quot;&quot;GetBkEndUI&quot;&quot;, &quot;&quot;f=s&quot;&quot;, &quot;&quot;r=l&quot;&quot;</code></pre></div><p>Этим же методом можно легко организовать вызов _thiscall, сделав ассемблерную вставку:<br /></p><div class="codebox"><pre><code>handle = Wrap.LoadLibrary(&quot;&quot;blang&quot;&quot;)
func = Wrap.GetProcAddress(handle, &quot;&quot;?FindProc@CBLModule@@QBEHPBDH@Z&quot;&quot;)        &#039;CBLModule::FindProc
Wrap.RegisterAddr buf, &quot;&quot;FindProc&quot;&quot;, &quot;&quot;i=sl&quot;&quot;, &quot;&quot;r=l&quot;&quot;
.
.
.
Function this_call(ECX, Addr)                                &#039;    
    Wrap.NumPut &amp;hB9,                     buf, 0, &quot;&quot;b&quot;&quot;    &#039;    mov ecx, ....   pObj
    Wrap.NumPut ECX,                     buf, 1
    Wrap.NumPut    &amp;hE9,                     buf, 5, &quot;&quot;b&quot;&quot;    &#039;    jmp ...Addr
    Wrap.NumPut    Addr - (buf + 6 + 4),     buf, 6                &#039;
End Function</code></pre></div><p><strong>2.</strong> Снимает ограничение на количество вызовов RegisterCallBack. Это реализовано, путем организации связанного списка функций, аналогично, как это делает метод Register.</p><p>Технические исправления:<br />* в IClassFactory::CreateInstance изменен размер объекта на указатель на последний вызов RegisterCallBack;<br />* IDispatch::Release освобождается не только память под объект, но и память выделенная методами Register и обновленным RegisterCallBack; так же вызывается Release для объекта vbscript.</p><p>P.S. Всё сказанное относится к конкретной версии dll, т.к. в скрипте используются &quot;абсолютные&quot; offset&#039;ы, привязанные к файлу «dynwrapx.dll».<br />P.P.S. В связи с тем, что мой опыт программирования на ассемблере не велик, возможно что-то я сделал не оптимально, поэтому буду рад услышать критику.</p>]]></content>
			<author>
				<name><![CDATA[chessman]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=25359</uri>
			</author>
			<updated>2011-01-05T09:32:05Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=43318#p43318</id>
		</entry>
</feed>
