<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Серый форум &mdash; VBScript: DynamicWrapper, передача строк по ссылке]]></title>
		<link>https://forum.script-coding.com/viewtopic.php?id=1107</link>
		<atom:link href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=1107&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «VBScript: DynamicWrapper, передача строк по ссылке».]]></description>
		<lastBuildDate>Fri, 01 Feb 2008 12:00:11 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[VBScript: DynamicWrapper, передача строк по ссылке]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=8543#p8543</link>
			<description><![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>]]></description>
			<author><![CDATA[null@example.com (The gray Cardinal)]]></author>
			<pubDate>Fri, 01 Feb 2008 12:00:11 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=8543#p8543</guid>
		</item>
	</channel>
</rss>
