Что нового

Данные, строки Добавить в структуру три объекта с числом

musicstashall

Новичок
Сообщения
275
Репутация
4
Имеется такая функция, передает данные в другой процесс. В исходном варианте передается одно число и строка. Необходимо переделать структуру, чтобы можно было передавать еще два числа целых int, то есть, строка и три числа. Числа могут быть большими, допустим, четыре - пять порядков: xxx xxx xxx xxx

Код:
#Include <APIConstants.au3>

Global Const $tagCOPYDATASTRUCT = 'ulong_ptr dwData;dword cbData;ptr lpData'

_SendMsg('Нубокодер_Приемник', 1, 'строка') ; Передаем строку "строка" из источника 1 (см. второй параметр)

Func _SendMsg($hWnd, $iData, $sData = '')

    Local $tCOPYDATASTRUCT = DllStructCreate($tagCOPYDATASTRUCT)
    Local $iLength = StringLen($sData)
    Local $tText, $aResult

    If Not IsHWnd($hWnd) Then
        $hWnd = WinGetHandle($hWnd)
    EndIf
    $tCOPYDATASTRUCT.dwData = $iData
    If $iLength Then
        $tText = DllStructCreate('wchar Text[' & ($iLength + 1) & ']')
        $tText.Text = $sData
        $tCOPYDATASTRUCT.cbData = DllStructGetSize($tText)
        $tCOPYDATASTRUCT.lpData = DllStructGetPtr($tText)
    Else
        $tCOPYDATASTRUCT.cbData = 0
        $tCOPYDATASTRUCT.lpData = Null
    EndIf
    $aResult = _SendMessage($hWnd, $WM_COPYDATA, $wParam, $tCOPYDATASTRUCT, 0, "wparam", 'struct*')
    If (@Error) Or (Not $aResult) Then
        Return SetError(1, 0, 0)
    EndIf
    Return 1
EndFunc   ;==>_SendMsg


Процесс-приемник:
#Include <APIConstants.au3>

Global Const $tagCOPYDATASTRUCT = 'ulong_ptr dwData;dword cbData;ptr lpData'

$hReceiver = GUICreate('Нубокодер_Приемник')
GUIRegisterMsg($WM_COPYDATA, 'WM_COPYDATA')

While 1
    Sleep(1000)
WEnd

Func WM_COPYDATA($hWnd, $iMsg, $wParam, $lParam)
    Switch $hWnd
        Case $hReceiver

            Local $tCOPYDATASTRUCT = DllStructCreate($tagCOPYDATASTRUCT, $lParam)
            Local $tText = DllStructCreate('wchar szData[' & ($tCOPYDATASTRUCT.cbData / 2) & ']', $tCOPYDATASTRUCT.lpData)

            ConsoleWrite('Сообщение от источника ' & $tCOPYDATASTRUCT.dwData & ': ' & $tText.szData & @CRLF)
            Return 1
    EndSwitch
    Return 0
EndFunc   ;==>WM_COPYDATA
Сообщение автоматически объединено:

Вот делаю следующим образом:

Код:
GetData(CreateData('Поэтому обычно в начало структуры записывают ее размер, а стороннее приложение считав размер - читает структуру(в твоем случае массив переменной длинны).', 264))

Func CreateData($sText, $iNumber)
    Local $iSize = StringLen($sText)
    $tBuffer = DllStructCreate('uint;byte[' & $iSize & '];uint;uint;uint')
    DllStructSetData($tBuffer, 1, $iSize)
    DllStructSetData($tBuffer, 2, $sText)
    DllStructSetData($tBuffer, 3, $iNumber)
    DllStructSetData($tBuffer, 4, 3951123211)
    DllStructSetData($tBuffer, 5, 11124)
    Return $tBuffer
EndFunc

Func GetData($pBuffer)
    $tSize = DllStructCreate('uint', DllStructGetPtr($pBuffer))

    $tBuffer = DllStructCreate('byte[' & DllStructGetData($tSize, 1)& '];uint;uint;uint', (DllStructGetPtr($pBuffer) + DllStructGetSize($tSize)))

    MsgBox(0, '', 'Text: ' & BinaryToString(DllStructGetData($tBuffer, 1)) & @CRLF & _
                  'Number1: ' & DllStructGetData($tBuffer, 2) & @CR & 'Number2: ' & DllStructGetData($tBuffer, 3) & @CR & 'Number3: ' & DllStructGetData($tBuffer, 4))
EndFunc


Второе в примере число (самое большое) уже ограничено в длине, больше его уже не могу передавать. С чем это связано?
 
Последнее редактирование:

InnI

AutoIT Гуру
Сообщения
4 456
Репутация
1 207
С чем это связано?
UINT имеет размер 4 байта. Следовательно, максимальное значение 0xFFFFFFFF или 4294967295.
Для передачи бОльших значений используйте UINT64. Но в этом случае, вероятно, нужна х64 система.
Сообщение автоматически объединено:

На 32-разрядной системе UINT64 работает. Максимальное значение 0x7FFFFFFFFFFFFFFF или 9223372036854775807
Код:
ConsoleWrite(DllStructSetData(DllStructCreate("uint64"), 1, 0x7FFFFFFFFFFFFFFF)) ; 9223372036854775807
 
Последнее редактирование:
Автор
M

musicstashall

Новичок
Сообщения
275
Репутация
4
А сколько байт имеет UINT64 ? Стало быть 8?
 

InnI

AutoIT Гуру
Сообщения
4 456
Репутация
1 207
В справке по DllStructCreate всё расписано.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 473
Репутация
2 403
В данном случае можно было бы использовать char.
 

Cytrus

Новичок
Сообщения
103
Репутация
3
А сколько байт имеет UINT64 ? Стало быть 8?
Ну а сколько? Конечно же, это 64-х битное, целое число.
И конечно же, для его представления вполне хватит 8-ми байт.
Кстати, musicstashal, а что у вас не получается? Вы не провобовали, вместо первого члена структуры, передасть массив?
В массиве можно много передасть цифр (INT\UINT). Я имею ввиду "dwData".
 
Последнее редактирование:
Автор
M

musicstashall

Новичок
Сообщения
275
Репутация
4
В данном случае можно было бы использовать char
Надо же, я так и использовал, только wchar, но мне казалось это не совсем правильным.

Сообщение автоматически объединено:

Вы не провобовали, вместо первого члена структуры, передасть массив?
В массиве можно много передасть цифр (INT\UINT). Я имею ввиду "dwData".
Не соображу) Массивы я передаю как строку. А вы что имеете ввиду?
Сообщение автоматически объединено:

Да, я понял. Сделал таким образом:
Код:
Global Const $tagCOPYDATASTRUCT = 'ulong_ptr dwData;dword cbData;ptr lpData'
Func _SendMsg($hWnd, $wParam, $lParam, $GetSize = True)
    Local $tCOPYDATASTRUCT = DllStructCreate($tagCOPYDATASTRUCT)
    Local $iLength = StringLen($lParam)
    Local $tText = DllStructCreate('wchar Text[' & ($iLength + 1) & ']')
    Local $tData = DllStructCreate('boolean IsFile; uint aSize; uint fCount; uint dCount')
    Local $iData, $aResult
    If $GetSize Then $iData = DirGetSize($lParam, $DIR_EXTENDED)
    If $GetSize And @error Then
        $tData.aSize = FileGetSize($lParam)
        $tData.fCount = 1
        $tData.dCount = 0
        $tData.IsFile = 1
    ElseIf $GetSize Then
        $tData.aSize = $iData[0]
        $tData.fCount = $iData[1]
        $tData.dCount = $iData[2]
        $tData.IsFile = 0
    EndIf
    $tText.Text = $lParam
    $tCOPYDATASTRUCT.cbData = DllStructGetSize($tText)
    $tCOPYDATASTRUCT.lpData = DllStructGetPtr($tText)
    $tCOPYDATASTRUCT.dwData = DllStructGetPtr($tData)
    $aResult = _SendMessage($hWnd, $WM_COPYDATA, $wParam, $tCOPYDATASTRUCT, 0, "wparam", 'struct*')
    If (@Error) Or (Not $aResult) Then
        Return SetError(1, 0, 0)
    EndIf
    Return 1
EndFunc   ;==>_SendMsg


Код:
Global Const $tagCOPYDATASTRUCT = 'ulong_ptr dwData;dword cbData;ptr lpData'
Local $tCOPYDATASTRUCT = DllStructCreate($tagCOPYDATASTRUCT, $lParam)
Local $tText = DllStructCreate('wchar szData[' & ($tCOPYDATASTRUCT.cbData / 2) & ']', $tCOPYDATASTRUCT.lpData)
Local $tData = DllStructCreate('boolean IsFile; uint aSize; uint fCount; uint dCount', $tCOPYDATASTRUCT.dwData)
$fList = AddDataToFileList($hGui, $tText.szData, Int($tData.aSize), Int($tData.fCount), Int($tData.dCount), Int($tData.IsFile), $setpath)

Числа получаю не реальные, сильно завышенные. Что не так? Вообще, очень нестабильно работает, если просто строки местами в очередности меняю, что и значения тоже меняются. Не понимаю.
IsFile — здесь только два состояния может быть False и True. А aSize, fCount, dCount желательно максимально возможные числа
 
Последнее редактирование:
Верх