Что нового

Как работают функции с DllStructGetPtr()

Viktor1703

AutoIT Гуру
Сообщения
1 535
Репутация
411
Предположим есть структура:

Код:
Global $tRECT = DllStructCreate("int;int;int;int")
DllStructSetData($tRECT, 1, 20)
DllStructSetData($tRECT, 2, 20)
DllStructSetData($tRECT, 3, 200)
DllStructSetData($tRECT, 4, 35)


Некоторые функции запрашивают указатель на эту структуру который добывается с помощью:

Код:
Global $tRECT = DllStructCreate("int;int;int;int")
DllStructSetData($tRECT, 1, 20)
DllStructSetData($tRECT, 2, 20)
DllStructSetData($tRECT, 3, 200)
DllStructSetData($tRECT, 4, 35)
$Ptr = DllStructGetPtr($tRECT) ; Указатель на структуру


После чего возврящается некий хэндл (указатель), хочется узнать, как функции добывают данные из структуры используя лишь её указатель?





Всё, разобрался как работает, мы просто в памяти ищем по определённому адресу значения а адрес это и есть указатель на структуру:

Код:
#Include <WinAPIEx.au3>

Global $tRECT = DllStructCreate("int;int;int;int")
DllStructSetData($tRECT, 1, 20)
DllStructSetData($tRECT, 2, 20)
DllStructSetData($tRECT, 3, 200)
DllStructSetData($tRECT, 4, 35)


$Value = GetStructData(DllStructGetPtr($tRECT))
MsgBox(0, "Info", $Value[0] & @CRLF & $Value[1] & @CRLF & $Value[2] & @CRLF & $Value[3])


Func GetStructData($iPtr)
	Local $hData[4]
	Local $iHandle = _WinAPI_OpenProcess(BitOR(0x001F0FFF, 0x00000008), False, @AutoItPID)
    Local $tBuffer = DllStructCreate("int;int;int;int")
    _WinAPI_ReadProcessMemory($iHandle, $iPtr, DllStructGetPtr($tBuffer), DllStructGetSize($tBuffer), 0)
	$hData[0] = DllStructGetData($tBuffer, 1)
	$hData[1] = DllStructGetData($tBuffer, 2)
	$hData[2] = DllStructGetData($tBuffer, 3)
	$hData[3] = DllStructGetData($tBuffer, 4)
	Return $hData
EndFunc
 

AZJIO

Меценат
Меценат
Сообщения
2 752
Репутация
1 149
Viktor1703
А какие именно функции? Может это нативные функции, для которых уже определён формат данных. В справке целый раздел таких структур - StructureConstants.
 
Автор
V

Viktor1703

AutoIT Гуру
Сообщения
1 535
Репутация
411
Да дело не в функциях было, мне нужно было узнать как из структуры вытащить данные по её указателю, я уже разобрался и в верху привёл пример, точто также можно и записывать данные в структуру по её указателю, только нужно внести мелкие изменения....

Вот чтобы записать данные в структуру:

Код:
#Include <WinAPIEx.au3>

Global $tRECT = DllStructCreate("int;int;int;int")

SetStructData(DllStructGetPtr($tRECT))

ConsoleWrite(DllStructGetData($tRECT, 1) & @CRLF & _
			 DllStructGetData($tRECT, 2) & @CRLF & _
			 DllStructGetData($tRECT, 3) & @CRLF & _
			 DllStructGetData($tRECT, 4))

Func SetStructData($iPtr)
	Local $iHandle = _WinAPI_OpenProcess(BitOR(0x001F0FFF, 0x00000020, 0x00000008), False, @AutoItPID)
	Local $tBuffer = DllStructCreate("int;int;int;int")
	DllStructSetData($tBuffer, 1, 20)
    DllStructSetData($tBuffer, 2, 20)
    DllStructSetData($tBuffer, 3, 200)
    DllStructSetData($tBuffer, 4, 35)
	_WinAPI_WriteProcessMemory($iHandle, $iPtr, DllStructGetPtr($tBuffer), DllStructGetSize($tBuffer), 0)
EndFunc
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 714
Во-первых, DllStructGetPtr() возвращает не хендл, а адрес блока памяти, с которого начинается структура. Во-вторых, все намного проще, если структура находится в текущем процессе.

Код:
$tRECT1 = DllStructCreate('int;int;int;int')
DllStructSetData($tRECT1, 1, 20)
DllStructSetData($tRECT1, 2, 20)
DllStructSetData($tRECT1, 3, 200)
DllStructSetData($tRECT1, 4, 35)
$pRECT1 = DllStructGetPtr($tRECT1)

$tRECT2 = DllStructCreate('int;int;int;int', $pRECT1)
ConsoleWrite(DllStructGetData($tRECT2, 1) & @CR & _
             DllStructGetData($tRECT2, 2) & @CR & _
             DllStructGetData($tRECT2, 3) & @CR & _
             DllStructGetData($tRECT2, 4) & @CR)


Если бы вы прочитали эту тему, то вопрос отпал бы сам собой.

P.S

Вы можете просматривать структуры с помощью функции _WinAPI_DisplayStruct(), которая понимает как адресс ($pRECT), так и саму структуру ($tRECT).
 
Автор
V

Viktor1703

AutoIT Гуру
Сообщения
1 535
Репутация
411
Да это я тоже знаю, мне просто было интересно, как вытащить данные из структуры по её указателю, тему я читал, спасибо за FAQ
 
Верх