Orion9

|
Posted: Sat Oct 03, 2026 14:26 Post subject: |
|
|
AkulaBig
Ну в общем понятно, почему я не сдал делать через stdin/stdout. Геморроя больше.
Когда взаимодействие идет через файлы, Autorun вообще ничего не знает о процессе exiftool: его задача - записать в один файл и ждать ответа в другом.
Но когда взаимодействие идет с самом процессом, приходится ждать пока он не отдаст все данные до конца, и так становится сложнее организовать таймаут. Пока я сделал так, но это приводит к другим проблемам
 Hidden text | Code: | Func ReadResponse()
Local output = "", chunk = "", bytesAvailable, i = 0
# Буфер для побайтового/посимвольного чтения из пайпа
Static readBuf = Buffer(1024*2)
readBuf.Zero()
While 1
If Not DllCall("PeekNamedPipe", _
"Ptr", hChildStdOutRd, _
"Ptr", 0, "UInt", 0, "Ptr", 0, "Dword*", @bytesAvailable, "Ptr", 0, "Int") Then
Return "---" & auCRLF & _
"Exiftool <no-response>" & auCRLF & "---"
EndIf
If bytesAvailable <= 0 Then
i += 1
# OutputDebugString("bytesAvailable = " & bytesAvailable & " try = " & i)
Sleep(10)
If i > 50 Then
Return "---" & auCRLF & "Exiftool <time-out>" & auCRLF & "---" & auCRLF & output
Else
Continue
EndIf
EndIf
Local bytesRead = 0
# OutputDebugString("ReadFile")
If Not DllCall("ReadFile", _
"Ptr", hChildStdOutRd, _
"Ptr", readBuf.Ptr, "UInt", readBuf.Size, "UInt*", @bytesRead, "Ptr", 0) Then
Break
EndIf
If bytesRead <= 0 Then Break
# chunk = readBuf.GetStr(0, bytesRead, "ANSI")
chunk = readBuf.GetStr(0, bytesRead, "UTF-8")
output &= chunk
If StrPos(chunk, "{ready}") Then
Break
EndIf
Wend
Return StrTrim(output)
EndFunc |
|
|