<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Серый форум &mdash; AutoHotKey: Передача указателя между двумя процессами (скриптами)]]></title>
	<link rel="self" href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=3203&amp;type=atom" />
	<updated>2018-02-09T16:55:42Z</updated>
	<generator>PunBB</generator>
	<id>https://forum.script-coding.com/viewtopic.php?id=3203</id>
		<entry>
			<title type="html"><![CDATA[Re: AutoHotKey: Передача указателя между двумя процессами (скриптами)]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=123651#p123651" />
			<content type="html"><![CDATA[<p>Так началась легенда...</p>]]></content>
			<author>
				<name><![CDATA[cahta_emae30]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=39061</uri>
			</author>
			<updated>2018-02-09T16:55:42Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=123651#p123651</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AutoHotKey: Передача указателя между двумя процессами (скриптами)]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=23709#p23709" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>garkin пишет:</cite><blockquote><p>А чем отличается MoveMemory от CopyMemory? Я так понял, что movememory может копировать между перекрывающимися блоками. Она затирает за собой память источника, или просто использует промежуточный буфер?</p></blockquote></div><p>Видимо, разница именно в этом. MoveMemory именно копирует, источник она специально не затирает. Если блоки перекрываются и запись должна затирать места, которые ещё не прочитаны, она просто меняет направление копирования на обратное, т.е. копирует с конца к началу. Буфер не используется.</p>]]></content>
			<author>
				<name><![CDATA[YMP]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=81</uri>
			</author>
			<updated>2009-05-26T12:58:41Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=23709#p23709</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AutoHotKey: Передача указателя между двумя процессами (скриптами)]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=23669#p23669" />
			<content type="html"><![CDATA[<p>Огромное спасибо. А чем отличается MoveMemory от CopyMemory? Я так понял, что movememory может копировать между перекрывающимися блоками. Она затирает за собой память источника, или просто использует промежуточный буфер?</p>]]></content>
			<author>
				<name><![CDATA[garkin]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=16899</uri>
			</author>
			<updated>2009-05-25T17:34:05Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=23669#p23669</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AutoHotKey: Передача указателя между двумя процессами (скриптами)]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=23662#p23662" />
			<content type="html"><![CDATA[<p>Расследование показало, что CopyMemory — это псевдоним RtlCopyMemory, которая в свою очередь — псевдоним memcpy. Ну и типы неправильные были. Так что, видимо, так:<br /></p><div class="codebox"><pre><code>From:= &quot;abcdefgh&quot;
To:=&quot;1234567890&quot;

DllCall(&quot;msvcrt\memcpy&quot;
       , &quot;Str&quot;, To
       , &quot;Str&quot;, From
       , &quot;Uint&quot;, 5
       , &quot;Cdecl&quot;)

msgbox % &quot;DllResult: &quot; To</code></pre></div><p>Ещё можно использовать RtlMoveMemory:<br /></p><div class="codebox"><pre><code>From:= &quot;abcdefgh&quot;
To:=&quot;1234567890&quot;

DllCall(&quot;RtlMoveMemory&quot;
       , &quot;Str&quot;, To
       , &quot;Str&quot;, From
       , &quot;Uint&quot;, 5)

msgbox % &quot;DllResult: &quot; To</code></pre></div>]]></content>
			<author>
				<name><![CDATA[YMP]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=81</uri>
			</author>
			<updated>2009-05-25T12:18:56Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=23662#p23662</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AutoHotKey: Передача указателя между двумя процессами (скриптами)]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=23653#p23653" />
			<content type="html"><![CDATA[<p>Не могу заставить работать CopyMemory, подскажите где глюк.<br /></p><div class="codebox"><pre><code>    From:= &quot;abcdefgh&quot;
    To:=&quot;1234567890&quot;

    DllCall(&quot;CopyMemory&quot;
       , UintP, To
       , UintP, From
       , Uint, 5)

    msgbox % &quot;DllResult: &quot; To    ;И фиг - нет изменений, &quot;1234567890&quot;
ExitApp</code></pre></div>]]></content>
			<author>
				<name><![CDATA[garkin]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=16899</uri>
			</author>
			<updated>2009-05-25T10:40:14Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=23653#p23653</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AutoHotKey: Передача указателя между двумя процессами (скриптами)]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=23620#p23620" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>garkin пишет:</cite><blockquote><p>Ну уж если совсем извращаться, то можно и невидимый контрол на форме.</p></blockquote></div><p>Тоже вариант, но все равно придется использовать &quot;PostMessage&quot; для передачи скрипту момента изменения контрола.</p>]]></content>
			<author>
				<name><![CDATA[Wlad]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=1903</uri>
			</author>
			<updated>2009-05-24T13:43:59Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=23620#p23620</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AutoHotKey: Передача указателя между двумя процессами (скриптами)]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=23619#p23619" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>Wlad пишет:</cite><blockquote><p>Еще вариант&nbsp; - использовать буфер обмена.</p><p>передающий скрипт:<br />clipboard = 123456</p><p>принимающий скрипт:<br />OnClipboardChange:<br />MsgBox, %clipboard%<br />return</p></blockquote></div><p>Ну уж если совсем извращаться, то можно и невидимый контрол на форме.</p>]]></content>
			<author>
				<name><![CDATA[garkin]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=16899</uri>
			</author>
			<updated>2009-05-24T13:35:34Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=23619#p23619</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AutoHotKey: Передача указателя между двумя процессами (скриптами)]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=23618#p23618" />
			<content type="html"><![CDATA[<p>Еще вариант&nbsp; - использовать буфер обмена.</p><p>передающий скрипт:<br />clipboard = 123456</p><p>принимающий скрипт:<br />OnClipboardChange:<br />MsgBox, %clipboard%<br />return</p>]]></content>
			<author>
				<name><![CDATA[Wlad]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=1903</uri>
			</author>
			<updated>2009-05-24T13:32:50Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=23618#p23618</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AutoHotKey: Передача указателя между двумя процессами (скриптами)]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=23614#p23614" />
			<content type="html"><![CDATA[<p>Всё когда-то случается впервые...:rolleyes: Но лучше поздно, чем никогда!</p>]]></content>
			<author>
				<name><![CDATA[teadrinker]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=24515</uri>
			</author>
			<updated>2009-05-24T10:19:49Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=23614#p23614</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AutoHotKey: Передача указателя между двумя процессами (скриптами)]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=23613#p23613" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>teadrinker пишет:</cite><blockquote><p><img src="//forum.script-coding.com/img/smilies/lol.png" width="15" height="15" /> Каюсь. Но, справедливости ради, о нём можно было узнать ещё несколькими постами <a href="http://forum.script-coding.com/viewtopic.php?pid=23580#p23580">ранее</a>, а также в конце <a href="http://www.autohotkey.com/docs/commands/OnMessage.htm">этой</a> страницы.</p></blockquote></div><p>И что тебе помешало? Давай уж до конца кайся, облегчи душу. <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" /></p>]]></content>
			<author>
				<name><![CDATA[YMP]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=81</uri>
			</author>
			<updated>2009-05-24T10:11:17Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=23613#p23613</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AutoHotKey: Передача указателя между двумя процессами (скриптами)]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=23612#p23612" />
			<content type="html"><![CDATA[<p><img src="//forum.script-coding.com/img/smilies/lol.png" width="15" height="15" /> Каюсь. Но, справедливости ради, о нём можно было узнать ещё несколькими постами <a href="http://forum.script-coding.com/viewtopic.php?pid=23580#p23580">ранее</a>, а также в конце <a href="http://www.autohotkey.com/docs/commands/OnMessage.htm">этой</a> страницы.</p>]]></content>
			<author>
				<name><![CDATA[teadrinker]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=24515</uri>
			</author>
			<updated>2009-05-24T10:00:27Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=23612#p23612</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AutoHotKey: Передача указателя между двумя процессами (скриптами)]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=23611#p23611" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>teadrinker пишет:</cite><blockquote><p>А зачем? В Windows для обмена данными уже существует сообщение WM_COPYDATA.</p></blockquote></div><p>А ты давно о нём узнал-то? Судя по <a href="http://forum.script-coding.com/viewtopic.php?pid=23584#p23584">#5</a>, недавно. Ну а я только что — от тебя.</p>]]></content>
			<author>
				<name><![CDATA[YMP]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=81</uri>
			</author>
			<updated>2009-05-24T09:23:16Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=23611#p23611</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AutoHotKey: Передача указателя между двумя процессами (скриптами)]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=23610#p23610" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>YMP пишет:</cite><blockquote><p>Можно, например, зарегистрировать в обоих скриптах оконное сообщение...</p></blockquote></div><p>А зачем? В Windows для обмена данными уже существует сообщение <a href="http://msdn.microsoft.com/en-us/library/ms649011(VS.85).aspx">WM_COPYDATA</a>.</p>]]></content>
			<author>
				<name><![CDATA[teadrinker]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=24515</uri>
			</author>
			<updated>2009-05-24T08:12:12Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=23610#p23610</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AutoHotKey: Передача указателя между двумя процессами (скриптами)]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=23608#p23608" />
			<content type="html"><![CDATA[<p>YMP, огромное спасибо за пример реализации.<br />Просто у меня был уже отлаженый код для работы внутри одного скрипта с этим сообщением, где для своих нужд задействованы и lparam&nbsp; и wparam и была дилетантская надежда, что можно адаптироваться к многопроцессности без смены структуры сообщений, превратив указатель в волшебный &quot;глобальный&quot; вид, вроде far указаетлей dos.</p>]]></content>
			<author>
				<name><![CDATA[garkin]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=16899</uri>
			</author>
			<updated>2009-05-24T07:30:58Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=23608#p23608</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AutoHotKey: Передача указателя между двумя процессами (скриптами)]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=23605#p23605" />
			<content type="html"><![CDATA[<p><strong>garkin</strong><br />Не уверен, что точно понял Вашу ситуацию, но вот такая идея: у функций SendMessage и PostMessage есть два параметра — lParam и wParam. Вот уже два числа. Можно, например, зарегистрировать в обоих скриптах оконное сообщение с одним и тем же именем, и в нём потом пересылать PID и указатель (ReadAddress). А можно и два сообщения создать, в одном пересылать PID, а в другом — адрес данных и их размер.</p><p>Передающий скрипт:<br /></p><div class="codebox"><pre><code>Data =
(
Я теперь скупее стал в желаньях,
Жизнь моя, иль ты приснилась мне?
Словно я весенней гулкой ранью
Проскакал на розовом коне.
)

WinTitle := &quot;Окно №1&quot;  ; Заголовок целевого окна.
PID := DllCall(&quot;GetCurrentProcessId&quot;)

MsgPID  := DllCall(&quot;RegisterWindowMessage&quot;, &quot;Str&quot;, &quot;MsgPID&quot;)
MsgData := DllCall(&quot;RegisterWindowMessage&quot;, &quot;Str&quot;, &quot;MsgData&quot;)

F11::  ; Посылать по нажатию F11.
  hWnd := WinExist(WinTitle)
  If not hWnd {
    MsgBox, Не найдено окно:`n%WinTitle%.
    Return
  }

  wParam := PID
  lParam := 0    ; Сюда тоже что-нибудь можно положить.
  PostMessage, MsgPID, wParam, lParam,, ahk_id %hWnd%   ; Посылаем PID.

  wParam := &amp;Data
  lParam := StrLen(Data) + 1  ; Учитываем нулевой байт в конце строки.
  PostMessage, MsgData, wParam, lParam,, ahk_id %hWnd%  ; Адрес данных и размер.
Return</code></pre></div><p>Принимающий скрипт:<br /></p><div class="codebox"><pre><code>WinTitle := &quot;Окно №1&quot;

MsgPID  := DllCall(&quot;RegisterWindowMessage&quot;, &quot;Str&quot;, &quot;MsgPID&quot;)
MsgData := DllCall(&quot;RegisterWindowMessage&quot;, &quot;Str&quot;, &quot;MsgData&quot;)

OnMessage(MsgPID, &quot;GetPID&quot;)   ; Регистрация функций для обработки сообщений.
OnMessage(MsgData, &quot;GetData&quot;)

Gui, Show, w400 h300, %WinTitle%
Return


GetPID(wParam, lParam, uMsg, hWnd)
{
  Global PID := wParam
}

GetData(wParam, lParam, uMsg, hWnd)
{
  Global PID
  ReadAddress := wParam             ; Адрес, откуда читать.
  ReadSize := lParam                ; Сколько байт считывать.
  VarSetCapacity(Buf, ReadSize, 0)  ; Буфер, куда считывать.
  
  PROCESS_VM_READ := 0x10           ; Права на процесс.
  
  hProcess := DllCall(&quot;OpenProcess&quot;, UInt, PROCESS_VM_READ
                                   , Int, False
                                   , UInt, PID)
  If(!hProcess) {
    MsgBox, Не удалось открыть процесс.
    Return
  }
  
  Ret := DllCall(&quot;ReadProcessMemory&quot;, UInt, hProcess
                                    , UInt, ReadAddress
                                    , UInt, &amp;Buf
                                    , UInt, ReadSize
                                    , UInt, 0)
  
  DllCall(&quot;CloseHandle&quot;, UInt, hProcess) ; Освобождение хэндла процесса.
  
  If(!Ret) {
    MsgBox, Не удалось прочитать.
    Return
  }
  
  VarSetCapacity(Buf, -1) ; Обновление размера переменной, поскольку запись в неё
                          ; произошла со стороны и AutoHotkey об этом не знает.  
  MsgBox, %Buf%
}

GuiClose:
  ExitApp</code></pre></div>]]></content>
			<author>
				<name><![CDATA[YMP]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=81</uri>
			</author>
			<updated>2009-05-24T05:12:32Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=23605#p23605</id>
		</entry>
</feed>
