[решено] AutoIt работа с памятью.
Возник вопрос, могу ли я с помощью AutoIt не только считывать данные из памяти конкретного процесса, а зарезервировать в оперативной памяти n-ное количество ячеек которые будут хранить в себе определенные числа которые будут в режиме реального времени изменяться и далее считываться другим скриптом? Думал про работу через ini, но все же более интересен аспект работы с памятью :)
Или же если возможно то хотелось бы узнать можно ли структурировать по ячейкам буфер обмена, чтобы туда в определенные ячейки заносились данные одним скриптом и потом считывались другим скриптом. ClipGet ClipPut как я понял работает на весь буфер :( ini не предлагать, решение проблемы с помощью ини я знаю, хотелось бы узнать можно ли работать так с памятью и или буфером обмена. |
Не знаю на счёт памяти (уже не говорю о б.обмена), но пример интеракции между скриптами (через WM_COPYDATA) есть тут (также ещё один пример с использованием WM_COPYDATA есть тут, только в нём немного другая концепция).
Ну и простой пример интеракции: Отправитель.au3: Код:
ControlSetText("[CLASS:AutoIt v3;TITLE:~MyAu3_Interaction_Window]", "", "Edit1", "My data") Код:
AutoItWinSetTitle("~MyAu3_Interaction_Window") |
Меня к сожалению интерисует интеракция именно по средством использования ячеек памяти или же дробления клипборда на ячейки :(
|
Можно поинтересоваться, к чему такая специфика?
|
Belfigor, в принципе можно расшарить кусок памяти, поименовать и сделать доступным другим процессам, хотя придется поковыряться в API... НО для начала нужно четко представлять алгоритм синхронизации доступа, т.к. одновременно открыть объект на запись сможет только один процесс, советую для начала реализовать через обыкновенные файлы
|
Creat0R, ну... Просто это два вида интеракции скриптов которые мне было бы интересно освоить.
amel27, спасибо, буду курить API. Синхронизация доступа достаточно простая, запись будет производить один единственный скрипт, остальные будут читать :) |
|
Интеракцию между скриптами через память делаем через:
_MemoryWrite($iv_Address, $ah_Handle, $v_Data, $sv_Type = 'dword') _MemoryRead($iv_Address, $ah_Handle, $sv_Type = 'dword') |
Цитата:
|
Согласен, и если кто-нибудь подскажет любую идею, я с радостью сяду и попытаюсь ее реализовать. Несмотря на то что в данный момент мой скрипт вполне выполняет возложенные на себя надежды.
P.S. На разных компьютерах память может определяться к процессу по разному. ПО этому хотелось бы что-бы кто-нибудь подсказал интеракции скриптов друг между другом чтобы они знали какой скрипт куда пишет свое значение. |
как уже написал вариант Creat0R, + еще использовать можно эту UDF.
А технология простая: 1. Дочерный скрипт проверят в родителсьвом скрипте скрытое поле ввода (или же ячейку в памяти), если она пуста то записывает туда комманду, которую должен выполнить родителський скрипт. 2. Родителський скрипт в цикле проверяет свое скрытое поле, ждет получения комманды. Как только полученна комманда, начинает её выполнять, а перед этим очищает свое скрытое поле. вот и весь принцип интеракции |
Возьму на вооружение, спасибо :)
|
Как можно узнать, где в памяти процесса начинается та самая "куча"?
Например я открываю процесс, начинаю шарить в памяти с 0х00000000, и только с 0х00010000 идут данные, ячейки с 0х00000000 по 0х00010000 пусты. |
Цитата:
|
А как мне узнать где эта область начинается для конкретного уже существующего процесса?
|
Belfigor, обходной путь: ;)
Код:
$PID = ProcessExists("Explorer.Exe") |
amel27, сегодня ночью сяду смотреть что это дает, если оно поможет мне режить проблему вменяемой интеракции то слава богам, ты мой спаситель :)
|
Цитата:
я выдернул этот кусок из своей старой UDF по определению координат ярлыка на рабочем столе, там происходит выделение с копированием памяти между процессами... думаю то, что ты ищешь: http://forum.oszone.net/post-605123-110.html |
Время: 01:38. |
Время: 01:38.
© OSzone.net 2001-