Показать полную графическую версию : [решено] AutoIt работа с памятью.
Belfigor
22-06-2009, 22:18
Возник вопрос, могу ли я с помощью AutoIt не только считывать данные из памяти конкретного процесса, а зарезервировать в оперативной памяти n-ное количество ячеек которые будут хранить в себе определенные числа которые будут в режиме реального времени изменяться и далее считываться другим скриптом? Думал про работу через ini, но все же более интересен аспект работы с памятью :)
Или же если возможно то хотелось бы узнать можно ли структурировать по ячейкам буфер обмена, чтобы туда в определенные ячейки заносились данные одним скриптом и потом считывались другим скриптом. ClipGet ClipPut как я понял работает на весь буфер :(
ini не предлагать, решение проблемы с помощью ини я знаю, хотелось бы узнать можно ли работать так с памятью и или буфером обмена.
Не знаю на счёт памяти (уже не говорю о б.обмена), но пример интеракции между скриптами (через 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
Меня к сожалению интерисует интеракция именно по средством использования ячеек памяти или же дробления клипборда на ячейки :(
Можно поинтересоваться, к чему такая специфика?
Belfigor, в принципе можно расшарить кусок памяти, поименовать и сделать доступным другим процессам, хотя придется поковыряться в API... НО для начала нужно четко представлять алгоритм синхронизации доступа, т.к. одновременно открыть объект на запись сможет только один процесс, советую для начала реализовать через обыкновенные файлы
Belfigor
23-06-2009, 10:50
Creat0R, ну... Просто это два вида интеракции скриптов которые мне было бы интересно освоить.
amel27, спасибо, буду курить API. Синхронизация доступа достаточно простая, запись будет производить один единственный скрипт, остальные будут читать :)
буду курить 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')
Интеракцию между скриптами через память процесса »да, но это только половина операции, нужно еще как-то сообщить другому процессу о самом факте записи... опять же через сообщения, глобальные объекты ядра и т.п.
Belfigor
21-07-2009, 00:38
Согласен, и если кто-нибудь подскажет любую идею, я с радостью сяду и попытаюсь ее реализовать. Несмотря на то что в данный момент мой скрипт вполне выполняет возложенные на себя надежды.
P.S. На разных компьютерах память может определяться к процессу по разному. ПО этому хотелось бы что-бы кто-нибудь подсказал интеракции скриптов друг между другом чтобы они знали какой скрипт куда пишет свое значение.
как уже написал вариант 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 пусты.
где в памяти процесса начинается та самая "куча"? »куча - объект ОС и он нигде не начинается, через него осуществляется "привязка" физической памяти к виртуальной, при выделении каждого блока сообщается его положение (указатель) в адресном пространстве процесса
Belfigor
27-07-2009, 15:05
А как мне узнать где эта область начинается для конкретного уже существующего процесса?
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, сегодня ночью сяду смотреть что это дает, если оно поможет мне режить проблему вменяемой интеракции то слава богам, ты мой спаситель :)
если оно поможет мне режить проблему вменяемой интеракции »
строго говоря, эта UDF - игрушка и её нельзя использовать в рабочих скриптах, т.к. стартовый адрес находится в ведении процесса и может в любое время измениться, т.е. получать адрес можно только с одновременной блокировкой этого участка памяти... что и делает VirtualAllocEx()
я выдернул этот кусок из своей старой UDF по определению координат ярлыка на рабочем столе, там происходит выделение с копированием памяти между процессами... думаю то, что ты ищешь: http://forum.oszone.net/post-605123-110.html
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.