Задача: есть форма программы на Delphi. На ней есть несколько Label в которых находится текст, который постоянно меняется и его нужно получить.
Как известно в Delphi есть 2 схожих объекта это Label и Static. Найденые мной отличия: Label может иметь прозрачный фон, но нет Handle. У Static все наоборот. У Label текст получить сложно, но можно. У Static текст получить легко.
Поковыряв память процесса с помощью ArtMoney нашел законерность. Как получить строку:
1. Находим строку в которой записано имя нужного нам Label.
2. По адресу этой строки находим ячейку памяти с таким же значением. Это будет указатель на эту строку и этот адрес будет базовым для этого Label. Назовем его Label1, для простоты.
3. Таким же методом находим смещения относительно базы для собственно текста этой лайбл. Смещение для Caption(нужный нам текст) +0x5C, Hint(подсказка при наведении мыши) +0x78.
Теперь осталось все это перевести на AutoIt. Было бы здорово если адреса не менялись, то проблем бы небыло. Но загрузив программу в разное врмемя и на разных компах, адрес где хранится объект, меняется :( Т.е. нужно организовать поиск в пямити процесса. Вот тут засада. Получаю кусок памяти, посмотреть его могу визуально но обратится к нему не могу Вот кусок кода:
ни как немогу обратится к одной ячейки памяти из $stTemp, чтобы перебором найти там Label1.
Как известно в Delphi есть 2 схожих объекта это Label и Static. Найденые мной отличия: Label может иметь прозрачный фон, но нет Handle. У Static все наоборот. У Label текст получить сложно, но можно. У Static текст получить легко.
Поковыряв память процесса с помощью ArtMoney нашел законерность. Как получить строку:
1. Находим строку в которой записано имя нужного нам Label.
2. По адресу этой строки находим ячейку памяти с таким же значением. Это будет указатель на эту строку и этот адрес будет базовым для этого Label. Назовем его Label1, для простоты.
3. Таким же методом находим смещения относительно базы для собственно текста этой лайбл. Смещение для Caption(нужный нам текст) +0x5C, Hint(подсказка при наведении мыши) +0x78.
Теперь осталось все это перевести на AutoIt. Было бы здорово если адреса не менялись, то проблем бы небыло. Но загрузив программу в разное врмемя и на разных компах, адрес где хранится объект, меняется :( Т.е. нужно организовать поиск в пямити процесса. Вот тут засада. Получаю кусок памяти, посмотреть его могу визуально но обратится к нему не могу Вот кусок кода:
Код:
$hW = _WinAPI_FindWindow("TForm1", "Form1")
If $hW Then
$PId=0
_WinAPI_GetWindowThreadProcessId($hW, $PId)
If $PId Then
$DllInformation = _MemoryOpen($PId)
$lpAddress=0x00AD0000 ;намеренно укоротил опласть поиска для быстроты
DllCall($DllInformation[0], 'int', 'VirtualQueryEx', 'int', $DllInformation[1], 'ptr', $lpAddress, 'ptr', DllStructGetPtr($stMBI), 'int', DllStructGetSize($stMBI))
if ( (DllStructGetData( $stMBI, "Protect")=$PAGE_READWRITE) Or (DllStructGetData( $stMBI, "Protect")=$PAGE_READWRITE) ) Then
;Если область памяти доступна для записи, работаем с ним.
$strTypeBuffer = "byte[" & DllStructGetData( $stMBI, "RegionSize") & "]"
;$stTemp=DllStructCreate($strTypeBuffer)
;MsgBox(0,"", $strTypeBuffer)
$stTemp = _MemoryRead($lpAddress,$DllInformation, $strTypeBuffer)
MsgBox(0,"", $stTemp)
$stTemp = 0
EndIf
;WEnd
EndIf
EndIf
ни как немогу обратится к одной ячейки памяти из $stTemp, чтобы перебором найти там Label1.