Функция DllStructGetPtr

         Описание функции


DllStructGetPtr

Возвращает указатель структуры или элемент в структуре.

DllStructGetPtr ( Struct [, Element ] )

Параметры

Struct Структура возвращаемая функцией DllStructCreate().
Element [необязательный] Элемент структуры, указатель которой вам необходим, отсчёт от 1 или имя элемента указанного в DllStructCreate().

Возвращаемое значение

Успех:Возвращает указатель структуры.
Ошибка:Возвращает 0.
@error:0 = Нет ошибки.
1 = Структура не является корректной структурой возвращённой функцией DllStructCreate().
2 = Элемент за пределами границ структуры.

Примечания

Используется в DllCall().

См. также

DllCall, DllStructCreate

Пример

#include <StructureConstants.au3> ; $tagRECT

; Пример 1
; Возвращает дескриптор активного окна и использует WinGetPos для возвращения координат прямоугольника окна
$hWnd = WinGetHandle("") ; Тоже что "[active]" - получает дескриптор активного окна
$aWndPos = WinGetPos($hWnd) ; Получает координаты и размер окна

; Создаёт структуру
$tRECT = DllStructCreate($tagRECT)
If @error Then
    MsgBox(4096, "", "Ошибка создания структуры,  @error = " & @error)
    Exit
EndIf

; Делает вызов функции GetWindowRect из user32.dll
; При вызове DllCall требуется использовать указатель на структуру возвращённый функцией DllStructGetPtr
DllCall("user32.dll", "int", "GetWindowRect", _
        "hwnd", $hWnd, _
        "ptr", DllStructGetPtr($tRECT))

If @error Then
    MsgBox(4096, "", "Ошибка DllCall,  @error = " & @error)
    Exit
EndIf

;Получает возвращённые координаты прямоугольника окна
Local $iLeft = DllStructGetData($tRECT, "Left") ; или 1 вместо "Left".
Local $iTop = DllStructGetData($tRECT, 2) ; или "Top" вместо 2.
Local $iRight = DllStructGetData($tRECT, 3) ; или "Right" вместо 3.
Local $iBottom = DllStructGetData($tRECT, "Bottom") ; или 4 вместо "Bottom".

; Освобождает структуру
$tRECT = 0

; Отображает данные возвращённые функцией WinGetPos и возвращённые в структуру
MsgBox(4096, "Пример 1", "WinGetPos(): (" & $aWndPos[0] & ", " & $aWndPos[1] & ") " & _
        "(" & $aWndPos[2] + $aWndPos[0] & ", " & $aWndPos[3] + $aWndPos[1] & ")" & @CRLF & _
        "GetWindowRect(): (" & $iLeft & ", " & $iTop & ") (" & $iRight & ", " & $iBottom & ")")

;=========================================================
; Пример 2

; Создаёт структуру с данными int (целое положительное или отрицательное число)
$tStruct1 = DllStructCreate("int")
If @error Then
    MsgBox(4096, "", "Ошибка создания структуры,  @error = " & @error)
    Exit
EndIf

; DllStructGetPtr ссылка на элемент. Кроме того, значение будет присвоено согласно новому определению типа uint
$tStruct2 = DllStructCreate("uint", DllStructGetPtr($tStruct1, 1))
If @error Then
    MsgBox(4096, "", "Ошибка создания структуры,  @error = " & @error)
    Exit
EndIf

$tStruct3 = DllStructCreate("float", DllStructGetPtr($tStruct1, 1))
If @error Then
    MsgBox(4096, "", "Ошибка создания структуры,  @error = " & @error)
    Exit
EndIf

; Устанавливает данные
DllStructSetData($tStruct1, 1, -1)

; Показывает различия типов данных тех же самых данных
MsgBox(4096, "DllStruct", _
        "Указатели на структуру и их данные" & @CRLF & _
        "$tStruct1: " & DllStructGetPtr($tStruct1, 1) & @TAB & "int:    " & DllStructGetData($tStruct1, 1) & @CRLF & _
        "$tStruct2: " & DllStructGetPtr($tStruct2, 1) & @TAB & "uint:  " & DllStructGetData($tStruct2, 1) & @CRLF & _
        "$tStruct3: " & DllStructGetPtr($tStruct3, 1) & @TAB & "float: " & DllStructGetData($tStruct3, 1))

; Указатели на структуру те же самые, так как указывают на ту же область в памяти.

; Освобождает выделенную память
$tStruct1 = 0
$tStruct2 = 0
$tStruct3 = 0