Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   AutoIt (http://forum.oszone.net/forumdisplay.php?f=103)
-   -   [решено] AutoIt работа с памятью. (http://forum.oszone.net/showthread.php?t=143261)

Belfigor 22-06-2009 22:18 1149342

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

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

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

Creat0R 23-06-2009 00:00 1149399

Не знаю на счёт памяти (уже не говорю о б.обмена), но пример интеракции между скриптами (через WM_COPYDATA) есть тут (также ещё один пример с использованием WM_COPYDATA есть тут, только в нём немного другая концепция).

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

Отправитель.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 1149419

Меня к сожалению интерисует интеракция именно по средством использования ячеек памяти или же дробления клипборда на ячейки :(

Creat0R 23-06-2009 01:35 1149427

Можно поинтересоваться, к чему такая специфика?

amel27 23-06-2009 10:20 1149576

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

Belfigor 23-06-2009 10:50 1149603

Creat0R, ну... Просто это два вида интеракции скриптов которые мне было бы интересно освоить.

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

amel27 23-06-2009 10:54 1149607

Цитата:

Цитата Belfigor
буду курить API »

учебный пример на Си есть в книге Рихтера, ЛИНК с оффсайта, удачи!

Belfigor 20-07-2009 05:00 1172447

Интеракцию между скриптами через память делаем через:

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

amel27 20-07-2009 09:11 1172503

Цитата:

Цитата Belfigor
Интеракцию между скриптами через память процесса »

да, но это только половина операции, нужно еще как-то сообщить другому процессу о самом факте записи... опять же через сообщения, глобальные объекты ядра и т.п.

Belfigor 21-07-2009 00:38 1173213

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

proxy 21-07-2009 01:02 1173235

как уже написал вариант Creat0R, + еще использовать можно эту UDF.
А технология простая:

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

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

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

Belfigor 21-07-2009 01:24 1173244

Возьму на вооружение, спасибо :)

Belfigor 27-07-2009 07:06 1178619

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

amel27 27-07-2009 12:13 1178828

Цитата:

Цитата Belfigor
где в памяти процесса начинается та самая "куча"? »

куча - объект ОС и он нигде не начинается, через него осуществляется "привязка" физической памяти к виртуальной, при выделении каждого блока сообщается его положение (указатель) в адресном пространстве процесса

Belfigor 27-07-2009 15:05 1178985

А как мне узнать где эта область начинается для конкретного уже существующего процесса?

amel27 28-07-2009 08:21 1179549

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 1179554

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

amel27 28-07-2009 08:56 1179566

Цитата:

Цитата Belfigor
если оно поможет мне режить проблему вменяемой интеракции »

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

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


Время: 10:06.

Время: 10:06.
© OSzone.net 2001-