Orion9

|
Posted: Tue Dec 30, 2025 19:14 Post subject: |
|
|
jentoso
Я почитал топик на руборде и согласен с вами: теперь больше нет уверенности при входе в инсталлятор, что он корректно отобразиться и распакуется. По этому поводу Destiny уместно предложил, что нужно либо добавлять новый ключ в MultiArc, либо писать отдельный плагин для работы с InnoSetup.
Но не похоже, что MVV в ближайшее время будет готов взяться за доработку MultiArc, поэтому пришла идея сделать небольшую обертку для innounp.exe в виде батника и скрипта на Autorun, чтобы хотя бы была возможность видеть потенциально проблемные файлы.
В принципе, если сильно загнаться, можно сделать и распаковку, но я подумал, что в этом нет пока смысла. Сейчас скрипт просто анализирует содержимое inno-файла, и если файл содержит юникодные имена, информирует об этом при входе или распаковке. Сообщение не мешает, так как оно отображается всего секунду, но не заметить его будет сложно.
Можно не устанавливать батник и не вносить изменения в MultiArc.ini — использовать только один скрипт для анализа содержимого, повесив его на нужную комбинацию. Сейчас такой комбинацией является Alt+PgDown, но можно изменить. Скрипт написан на Autorun, т.ч. понадобится и Autorun.
 Autorun | Code: | Global gInnoFile, gInnoList
RegisterCommand 60039 TestInno
SetHotkeyAction /K:A /H:PGDN TestInno
Func TestInno()
Local bAlt = IsPressed(0x12)
Local T1 = GetUptime(), T2 = T1, T3
Local sInno = COMMANDER_PATH & "\Plugins\arc\InnoSetup\innounp.exe"
Local sPath = RequestCopyDataInfo("SP")
Local sName = RequestCopyDataInfo("SN")
Local sFile = sPath & sName
If Not FileExist(sFile) Then
If StrPos(sFile, gInnoFile) Then sFile = gInnoFile
Else
gInnoFile = sFile
EndIf
If Not FileExist(sFile) Then
ShowHint("File doesn't exist " & sFile)
Return
ElseIf StrPos(FileGetAttr(sFile), "D") Then
ShowHint("Can't process directory " & sFile)
Return
EndIf
Local a = List(), u = List()
Local ansi, utf8, wrong, msg, i = 0
#ProcessExecGetOutput ansi %sInno% ' -v -m "%sFile%"'
ProcessExecGetOutput /C:65001 utf8 %sInno% ' -v -m -u "%sFile%"'
ansi = WideToAnsi(utf8)
a.Text = ansi
u.Text = utf8
For i = 0 to u.Count - 1
If u[i] <> a[i] Then wrong &= u[i] & auCRLF
Next
Free(a, u)
T3 = Round(GetUptime() - T1, 0) / 1000
T3 = "Operation time: " & StrFormat("%.3f", T3) & " sec"
If wrong = "" Then
If bAlt Then
If i > 10 Then
MsgBox("This installer does not contain unicode filenames." & auCRLF & auCRLF & T3, "InnoSetup", 64)
Else
MsgBox(ansi & auCRLF & T3, "InnoSetup", 48)
EndIf
EndIf
Return
EndIf
Local w = List()
w.Text = StrTrim(wrong)
For i = 0 to w.Count - 1
If i < 10 Then
msg &= w[i] & auCRLF
Else
msg & = auCRLF& auCRLF & "And " & w.Count - 1 - i & " more."
Break
EndIf
Next
Free(w)
T3 = Round(GetUptime() - T1, 0) / 1000
T3 = "Operation time: " & StrFormat("%.3f", T3) & " sec"
If bAlt Then
MsgBox("This installer contains unicode filenames:" & auCRLF & auCRLF & msg & auCRLF & T3, "InnoSetup", 48)
Else
ShowRedHint("Unicode warning")
EndIf
EndFunc
Func ShowRedHint(HintText)
SetHintParam("ShowHint", "Font", 15, "Arial")
SetHintParam("ShowHint", "BackColor", 0xFF0000)
SetHintParam("ShowHint", "Text", 0xFFFFFF)
ShowHint(HintText, 0, 0, 1000, 1)
WinAlign(LAST_HINT_WINDOW)
Sleep(100)
SetHintParam("ShowHint", "Reload")
EndFunc
Func WideToAnsi(String)
Local sAnsi, nSize = StrLen(String)
Local buf = Buffer(nSize)
buf.Zero()
buf.SetStr(String, 0, nSize, "ANSI")
Local sAnsi = buf.GetStr(0, nSize, "ANSI")
Free(buf)
Return sAnsi
EndFunc |
Если нужно, чтобы при входе в инсталлятор скрипт автоматически предупреждал об юникоде:
 inno.bat ::@echo off
SetLocal EnableExtensions
::chcp 866
cls
if %~z2 EQU 0 goto End
if /i "%1" =="l" goto List
if /i "%1" =="e" goto Extract
exit
:List
"%COMMANDER_PATH%\Utilites\TCFS2\TCFS2.exe" /ef "tcm(60039,1)"
::echo Type in a password
"%~dp0innounp.exe" -v -m -u %2
if %errorlevel% == 0 goto End
exit
:Extract
"%COMMANDER_PATH%\Utilites\TCFS2\TCFS2.exe" /ef "sendmsg(findwnd(`AUTORUN_WINDOW`),12,0,`SetVar gInnoFile %2`)"
"%COMMANDER_PATH%\Utilites\TCFS2\TCFS2.exe" /ef "sendmsg(findwnd(`AUTORUN_WINDOW`),12,0,`SetVar gInnoList %3`)"
::"%COMMANDER_PATH%\Utilites\TCFS2\TCFS2.exe" /ef "tcm(60039,1)"
::pause 1
"%~dp0innounp.exe" -x -m -u %2 @%3
:End
 Multiarc.ini [InnoAutorun]
Description="InnoSetup"
Archiver="%COMMANDER_PATH%\Plugins\arc\InnoSetup\inno.bat"
Extension=exe
ID=49 6E 6E 6F 20 53 65 74 75 70
IDPos=<SeekID>
Start="^--------------------------------------"
End="^--------------------------------------"
Format0="zzzzzzzzzz yyyy tt dd hh mm n++"
List="ConPaste.exe /s /h%AQ /c%AWQ /p\"Введите пароль к дистрибутиву:\" \"Type in a password\" %PQA l %AQA"
ExtractWithPath="ConPaste.exe /s /h%AQ /c%AWQ /p\"Введите пароль к дистрибутиву:\" \"Type in a password\" %PQA e %AQA %LA"
Debug=0
BatchUnpack=1
Как видно из батника и ini, понадобится утилита TCFS2 и корректно указанные пути.
От себя скажу, что результат получился нормальный. Это намного лучше, чем когда вообще ничего не видно. |
|