Войти

Показать полную графическую версию : [решено] AutoIt работа с памятью.


Belfigor
22-06-2009, 22:18
Возник вопрос, могу ли я с помощью AutoIt не только считывать данные из памяти конкретного процесса, а зарезервировать в оперативной памяти n-ное количество ячеек которые будут хранить в себе определенные числа которые будут в режиме реального времени изменяться и далее считываться другим скриптом? Думал про работу через ini, но все же более интересен аспект работы с памятью :)

Или же если возможно то хотелось бы узнать можно ли структурировать по ячейкам буфер обмена, чтобы туда в определенные ячейки заносились данные одним скриптом и потом считывались другим скриптом. ClipGet ClipPut как я понял работает на весь буфер :(

ini не предлагать, решение проблемы с помощью ини я знаю, хотелось бы узнать можно ли работать так с памятью и или буфером обмена.

Creat0R
23-06-2009, 00:00
Не знаю на счёт памяти (уже не говорю о б.обмена), но пример интеракции между скриптами (через WM_COPYDATA) есть тут (http://forum.ru-board.com/topic.cgi?forum=5&topic=17705&start=1440#6) (также ещё один пример с использованием WM_COPYDATA есть тут (http://www.autoitscript.com/forum/index.php?showtopic=91346), только в нём немного другая концепция).

Ну и простой пример интеракции:

Отправитель.au3:


ControlSetText("[CLASS:AutoIt v3;TITLE:~MyAu3_Interaction_Window]", "", "Edit1", "My data")

Получатель.au3:


AutoItWinSetTitle("~MyAu3_Interaction_Window")

While 1
Sleep(10)

$sData = ControlGetText("[CLASS:AutoIt v3;TITLE:~MyAu3_Interaction_Window]", "", "Edit1")

If $sData <> "" Then
ControlSetText("[CLASS:AutoIt v3;TITLE:~MyAu3_Interaction_Window]", "", "Edit1", "")

MsgBox(64, @ScriptName & ' - Interaction recieved:', $sData)

Exit
EndIf
WEnd

Belfigor
23-06-2009, 01:04
Меня к сожалению интерисует интеракция именно по средством использования ячеек памяти или же дробления клипборда на ячейки :(

Creat0R
23-06-2009, 01:35
Можно поинтересоваться, к чему такая специфика?

amel27
23-06-2009, 10:20
Belfigor, в принципе можно расшарить кусок памяти, поименовать и сделать доступным другим процессам, хотя придется поковыряться в API... НО для начала нужно четко представлять алгоритм синхронизации доступа, т.к. одновременно открыть объект на запись сможет только один процесс, советую для начала реализовать через обыкновенные файлы

Belfigor
23-06-2009, 10:50
Creat0R, ну... Просто это два вида интеракции скриптов которые мне было бы интересно освоить.

amel27, спасибо, буду курить API. Синхронизация доступа достаточно простая, запись будет производить один единственный скрипт, остальные будут читать :)

amel27
23-06-2009, 10:54
буду курить API »
учебный пример на Си есть в книге Рихтера (http://alexsoft.home.nov.ru/), ЛИНК (http://www.autoitscript.com/forum/index.php?showtopic=87510) с оффсайта, удачи!

Belfigor
20-07-2009, 05:00
Интеракцию между скриптами через память делаем через:

_MemoryWrite($iv_Address, $ah_Handle, $v_Data, $sv_Type = 'dword')
_MemoryRead($iv_Address, $ah_Handle, $sv_Type = 'dword')

amel27
20-07-2009, 09:11
Интеракцию между скриптами через память процесса »да, но это только половина операции, нужно еще как-то сообщить другому процессу о самом факте записи... опять же через сообщения, глобальные объекты ядра и т.п.

Belfigor
21-07-2009, 00:38
Согласен, и если кто-нибудь подскажет любую идею, я с радостью сяду и попытаюсь ее реализовать. Несмотря на то что в данный момент мой скрипт вполне выполняет возложенные на себя надежды.
P.S. На разных компьютерах память может определяться к процессу по разному. ПО этому хотелось бы что-бы кто-нибудь подсказал интеракции скриптов друг между другом чтобы они знали какой скрипт куда пишет свое значение.

proxy
21-07-2009, 01:02
как уже написал вариант Creat0R, + еще использовать можно эту UDF (http://www.autoitscript.com/forum/index.php?showtopic=70955&hl=hash&st=0).
А технология простая:

1. Дочерный скрипт проверят в родителсьвом скрипте скрытое поле ввода (или же ячейку в памяти), если она пуста то записывает туда комманду, которую должен выполнить родителський скрипт.

2. Родителський скрипт в цикле проверяет свое скрытое поле, ждет получения комманды. Как только полученна комманда, начинает её выполнять, а перед этим очищает свое скрытое поле.

вот и весь принцип интеракции

Belfigor
21-07-2009, 01:24
Возьму на вооружение, спасибо :)

Belfigor
27-07-2009, 07:06
Как можно узнать, где в памяти процесса начинается та самая "куча"?
Например я открываю процесс, начинаю шарить в памяти с 0х00000000, и только с 0х00010000 идут данные, ячейки с 0х00000000 по 0х00010000 пусты.

amel27
27-07-2009, 12:13
где в памяти процесса начинается та самая "куча"? »куча - объект ОС и он нигде не начинается, через него осуществляется "привязка" физической памяти к виртуальной, при выделении каждого блока сообщается его положение (указатель) в адресном пространстве процесса

Belfigor
27-07-2009, 15:05
А как мне узнать где эта область начинается для конкретного уже существующего процесса?

amel27
28-07-2009, 08:21
Belfigor, обходной путь: ;)
$PID = ProcessExists("Explorer.Exe")
$adr = _ProcessGetAllocAddress($PID)
ConsoleWrite("0x"& Hex($adr) &@CRLF)

Func _ProcessGetAllocAddress ($PID)
Local $tPID = DllStructCreate("long")
Local $tBuffer = DllStructCreate("byte")

DllStructSetData($tPID, 1, $PID)
Local $hProc = DllCall('kernel32.dll', 'int', 'OpenProcess', "int", 0x38, "int", 0, "int", DllStructGetData($tPID,1))
Local $pMem = DllCall('kernel32.dll', 'int', 'VirtualAllocEx', "int", $hProc[0], "ptr", 0, "int", DllStructGetSize($tBuffer), "int", 0x3000, "int", 0x4)

DllCall('kernel32.dll', 'int', 'VirtualFreeEx', "int", $hProc[0], "ptr", $pMem[0], "int", 0, "int", 0x8000)
DllCall("kernel32.dll", "int", "CloseHandle", "int", $hProc[0])

Return $pMem[0]
EndFunc ; ==> _ProcessGetAllocAddress

Belfigor
28-07-2009, 08:32
amel27, сегодня ночью сяду смотреть что это дает, если оно поможет мне режить проблему вменяемой интеракции то слава богам, ты мой спаситель :)

amel27
28-07-2009, 08:56
если оно поможет мне режить проблему вменяемой интеракции »
строго говоря, эта UDF - игрушка и её нельзя использовать в рабочих скриптах, т.к. стартовый адрес находится в ведении процесса и может в любое время измениться, т.е. получать адрес можно только с одновременной блокировкой этого участка памяти... что и делает VirtualAllocEx()

я выдернул этот кусок из своей старой UDF по определению координат ярлыка на рабочем столе, там происходит выделение с копированием памяти между процессами... думаю то, что ты ищешь: http://forum.oszone.net/post-605123-110.html




© OSzone.net 2001-2012