musicstashall
Знающий
- Сообщения
- 322
- Репутация
- 7
Имеется такая функция, передает данные в другой процесс. В исходном варианте передается одно число и строка. Необходимо переделать структуру, чтобы можно было передавать еще два числа целых 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
Второе в примере число (самое большое) уже ограничено в длине, больше его уже не могу передавать. С чем это связано?
Последнее редактирование: