<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Серый форум &mdash; VBScript: DynamicWrapper, передача строк по ссылке]]></title>
	<link rel="self" href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=1107&amp;type=atom" />
	<updated>2008-02-01T12:00:11Z</updated>
	<generator>PunBB</generator>
	<id>https://forum.script-coding.com/viewtopic.php?id=1107</id>
		<entry>
			<title type="html"><![CDATA[VBScript: DynamicWrapper, передача строк по ссылке]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=8543#p8543" />
			<content type="html"><![CDATA[<p>Иногда при работе с <a href="http://www.script-coding.com/dynwrap.html">DynamicWrapper</a> возникают проблемы с передачей строк по ссылке функциям Win32API. Например, в JScript строка - это переменная типа Variant, которая содержит указатель на строку, т.е. адрес в памяти, где реально лежит строка. Строка в VBScript - это Variant, который содержит указатель на другой Variant, который уже содержит адрес строки (именно это дополнительное звено и даёт гибкость в плане передачи переменных в функцию - ByRef или ByVal). Но с этим, видимо, связаны и трудности при передаче строк через DynamicWrapper - вместо строки в переданной по ссылке переменной можно запросто получить мусор или получить даже обвал WSH.<br /></p><div class="codebox"><pre><code>Function GetData(v)
    If TypeName(v) &lt;&gt; &quot;String&quot; Then 
        GetData=v
        Exit Function
    End If
    d=CLng(0)
    pv=Wrap.strncpy(v, v, 1)
    pd=Wrap.strncpy(d, d, 1)
    Wrap.memcpy pd+8, pv+8, 8
    GetData=d
End Function

Set Wrap = CreateObject(&quot;DynamicWrapper&quot;)
Wrap.Register &quot;user32.dll&quot;, &quot;GetForegroundWindow&quot;,           &quot;f=s&quot;, &quot;r=l&quot;
Wrap.Register &quot;user32.dll&quot;, &quot;SendMessageW&quot;,        &quot;i=llll&quot;, &quot;f=s&quot;, &quot;r=l&quot;
Wrap.Register &quot;msvcrt.dll&quot;, &quot;strncpy&quot;,             &quot;i=wwl&quot;,  &quot;f=c&quot;, &quot;r=l&quot;
Wrap.Register &quot;msvcrt.dll&quot;, &quot;memcpy&quot;,              &quot;i=lll&quot;,  &quot;f=c&quot;, &quot;r=l&quot;

hwnd = Wrap.GetForegroundWindow()
length = Wrap.SendMessageW(hwnd, 14, 0, 0)
title = Space(length)
res = Wrap.SendMessageW(hwnd, 13 , length + 1, GetData(title))
WScript.Echo &quot;Длина: &quot; &amp; length &amp; VBCRLF &amp; Title</code></pre></div><p>Скрипт получает заголовок окна, находящегося на переднем плане. В функции GetData используется небольшой трюк, чтобы добыть из строковой переменной реальный адрес строки, который затем и передаётся SendMessageW. Трюк заключается в копировании указателя на строку из Variant&#039;a типа String в Variant типа Long, где он становится непосредственно доступен.<br />Автор идеи - <strong>YMP</strong>.</p>]]></content>
			<author>
				<name><![CDATA[The gray Cardinal]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=2</uri>
			</author>
			<updated>2008-02-01T12:00:11Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=8543#p8543</id>
		</entry>
</feed>
