AkulaBig
|
Posted: Thu Oct 01, 2026 14:54 Post subject: |
|
|
| Orion9 wrote: | | У вас сейчас в этой функции 60 раз читается ini, 60 раз проверяется id процесса и 60 раз удаляется файл. И это для каждой подсказки. |
Это я уже понял.
| Orion9 wrote: | | Я так и не понял, что хочу от этой подсказки, поэтому она осталась в недоделанном состоянии. |
В этом как-раз вся суть моего вопроса. Я-же на скрине показал ваш неформатированный вывод и какой должен быть форматированный вывод на моем скрине. М вот здесь появляется большое "но". Для такого форматированного вывода требуется прописать a = StrPart(String, ": ", 1), b = StrPart(String, ": ", 2). То-есть обработать наименование полей и поля отдельно. Тогда и от пробелов можно избавиться и от крякозябров. Но этот код работает только если нет условия If FieldIndex = 1. Стоит нам его использовать и StrPart(String, ": ", 1) выводит только наименование ОДНОГО поля! Я это тоже на скрине показал. Можно ли придумать решение этой проблемы?
То-есть неформатированный вывод, как на вашем скрине с If FieldIndex = 1 работает. Форматированный вывод, как на моем скрине с If FieldIndex = 1 не работает.
Но для MI подобный алгоритм у меня работает. Не понимаю, почему? Кажется совершенно одинаковый код самого вывода.
Добавлено спустя 35 минут:
На всякий случай решил ваш код выложить с неформатированным выводом. Может вам легче с ним будет работать. Просто он тоже обработан мной. Так как этот код у вас входит в пример для переключения между типом подсказок.
 Hidden text
| Code: |
# путь к утилите ExifTool
Global gMediaExifX32 = COMMANDER_PATH & "\Plugins\wlx\ExifToolView\exiftool.exe"
Global gHintPipe = ""
Global gExifPID = 0, gExifStay = 1, gExifOut = TEMP & "\exiftool_out.txt", gExifArgs = TEMP & "\exiftool_args.txt"
If Not ProcessExist("exiftool.exe") Then
#gExifPID = 0
FileWrite(gExifArgs, "", "UTF-8 NOBOM")
ShellExec /TT /SW_HIDE %gMediaExifX32% "-stay_open True -@ ""%gExifArgs%"""
EndIf
Func ET(FileName, FieldIndex, UnitIndex)
If StrPos(FileGetAttr(FileName), "D") Then Return
If FieldIndex = 1 Then
#ProcessExecGetOutput /C:65001 gHintPipe %gMediaExifX32% ' -G -S -lang ru "%FileName%"'
gHintPipe = GetExifInfo(FileName)
gHintPipe = StrPart(gHintPipe, ": ", 1)
Endif
Return StrPart(gHintPipe, auLF, FieldIndex)
EndFunc
Func GetExifInfo(FileName)
Static a = List(), u = List()
Local ansi, utf8, wrong = Chr(0xFFFD)
If Not gExifStay Then
# ProcessExecGetOutput ansi %gMediaExifX32% '-charset filename=Russian -G -S -lang ru "%FileName%"'
ProcessExecGetOutput ansi %gMediaExifX32% '-charset filename=Russian -lang ru "%FileName%"'
Else
If FileExist(gExifOut) Then
DllCall("kernel32.dll\DeleteFileW", "Wstr", gExifOut)
EndIf
#Local sArgs = "-W+!" & auCRLF & gExifOut & auCRLF & FileName & auCRLF & "-execute" & auCRLF
# Local sArgs = "-G" & auCRLF & _
# "-S" & auCRLF & _
# "-lang" & auCRLF & _
# "ru" & auCRLF & _
# "-W+!" & auCRLF & gExifOut & auCRLF & FileName & auCRLF & "-execute" & auCRLF
Local sArgs = "-lang" & auCRLF & _
"ru" & auCRLF & _
"-W+!" & auCRLF & gExifOut & auCRLF & FileName & auCRLF & "-execute" & auCRLF
Static obj = BinaryFile(gExifArgs, "a")
obj.WriteStr(sArgs, "", "UTF-8")
#Free(obj)
ansi = "<time-out>"
For i = 1 To 50
If FileExist(gExifOut) Then
ansi = FileRead(gExifOut, 0, "UTF-8")
DllCall("kernel32.dll\DeleteFileW", "Wstr", gExifOut)
Break
EndIf
Sleep(20) # time-out
Next
Return ansi
EndIf
Local nSize = StrLen(ansi)
Local buf = Buffer(nSize)
buf.Zero()
buf.SetStr(ansi, 0, nSize, "ANSI")
utf8 = buf.GetStr(0, nSize, "CP:65001")
Free(buf)
a.Count = 0
u.Count = 0
a.Text = ansi
u.Text = utf8
For i = 0 to u.Count - 1
If StrPos(u[i], wrong) Then u[i] = a[i]
Next
Return u.text
EndFunc
|
Я закомментил несколько ваших строк, чтобы русский язык появился. При -S названия полей могут быть только на английском. А при -G обязательно будут выводиться группы. Что, конечно, не нужно. Если эти ключи убрать и попытаться использовать StrPart(String, ": ", 1) у вас получится как у меня, вывод только одного поля. |
|