Словил ошибку "skin.ini error". Тыканье в экран и последующие перезапуски iCarDS не помогли. Это меня немного взбесило. Надо останавливаться, доставать клавиатуру и самому разбираться, что не так, потому что обработка этой ошибки сделана в iCarDS криво. После возникновения ошибки не нашел ни одной валидной копии skin.ini. В папке скина - три файла (skin.bak, skin.chs, skin.def) одинакового размера, забитые нулями, а сам skin.ini заполнен параметрами частично. Файлы во вложении.
Немного поковырялся, выяснил вот что:
- iCarDS после запуска создает копию skin.ini в файле skin.bak.
- Перед изменением какой-либо настройки скина - skin.ini копируется в bak-файл, после этого новая настройка сохраняется в skin.ini.
- При закрытии iCarDS - skin.ini копируется в bak-файл.
- Проверка валидного skin.ini происходит в команде "ONSKINSTART", которая в начале файла ExecTBL.ini:
- Если skin.ini в порядке, то срабатывает команда "_ONSKINSTART" и активируется окно "iCar DS".
- Если skin.ini поврежден, то он восстанавливается из файла skin.bak.
- Если skin.bak поврежден, то skin.ini восстанавливается из файла skin.chs.
- Если skin.chs поврежден, то skin.ini восстанавливается из файла skin.def.
- Если skin.def поврежден, то вываливается ошибка "skin.ini error", и дальше уже сам разбирайся.
На самом деле валидность skin.ini и других файлов определяется просто наличием в них переменной is_skin_ini со значением "ok".
Алгоритм работы команды "ONSKINSTART":
Код:
If ($is_skin_ini$ = "ok") Then
_ONSKINSTART
Activate;iCar DS
Else
LoadVarsFromFile;$SKINPATH$skin.bak
If ($is_skin_ini$ = "ok") Then
Load;ErrorCopyFromBak.skin
RUNW;$SKINPATH$SCRIPTS\cskin.exe|"$SKINPATH$skin.bak" "$SKINPATH$skin.ini"
ReloadSkin
Else
LoadVarsFromFile;$SKINPATH$skin.chs
If ($is_skin_ini$ = "ok") Then
Load;ErrorCopyFromDef.skin
RUNW;$SKINPATH$SCRIPTS\cskin.exe|"$SKINPATH$skin.chs" "$SKINPATH$skin.ini"
ReloadSkin
Else
LoadVarsFromFile;$SKINPATH$skin.def
If ($is_skin_ini$ = "ok") Then
Load;ErrorCopyFromDef.skin
RUNW;$SKINPATH$SCRIPTS\cskin.exe|"$SKINPATH$skin.def" "$SKINPATH$skin.ini"
ReloadSkin
Else
Load;ErrorSkinIni.skin
EndIf
EndIf
EndIf
EndIf
Решил исправить это безобразие. Для это немного подправил алгоритм, заменив вывод экрана ошибки:
Код:
Load;ErrorSkinIni.skin
на:
Код:
$mySkinBackup$ = "$SKINPATH$skin.bu"
LoadVarsFromFile;$mySkinBackup$
If ($is_skin_ini$ = "ok") Then
RUNW;$SKINPATH$SCRIPTS\cskin.exe|"$mySkinBackup$" "$SKINPATH$skin.ini"
ReloadSkin
Else
Load;ErrorSkinIni.skin
EndIf
Т.е. вместо появления экрана с ошибкой - skin.ini будет восстановлен из резервной копии skin.bu, путь к которой задается в переменной mySkinBackup. К этому резервному skin.bu не имеет доступ iCarDS. Сам резервный skin.bu создается один раз, просто вручную сделав копию. Если резервного skin.bu нет - вывалится привычная ошибка "skin.ini error".
В общем, обновленная команда ONSKINSTART у меня теперь выглядит так:
Код:
"ONSKINSTART","if;strcomp($is_skin_ini$;ok);{_ONSKINSTART||Activate;iCar DS};{LoadVarsFromFile;$SKINPATH$skin.bak||if;strcomp($is_skin_ini$;ok);{Load;ErrorCopyFromBak.skin||RUNW;$SKINPATH$SCRIPTS\cskin.exe|"$SKINPATH$skin.bak" "$SKINPATH$skin.ini"||ReloadSkin};{LoadVarsFromFile;$SKINPATH$skin.chs||if;strcomp($is_skin_ini$;ok);{Load;ErrorCopyFromDef.skin||RUNW;$SKINPATH$SCRIPTS\cskin.exe|"$SKINPATH$skin.chs" "$SKINPATH$skin.ini"||ReloadSkin};{LoadVarsFromFile;$SKINPATH$skin.def||if;strcomp($is_skin_ini$;ok);{Load;ErrorCopyFromDef.skin||RUNW;$SKINPATH$SCRIPTS\cskin.exe|"$SKINPATH$skin.def" "$SKINPATH$skin.ini"||ReloadSkin};{SETVAR;mySkinBackup;$SKINPATH$skin.bu||LoadVarsFromFile;$mySkinBackup$||if;strcomp($is_skin_ini$;ok);{RUNW;$SKINPATH$SCRIPTS\cskin.exe|"$mySkinBackup$" "$SKINPATH$skin.ini"||ReloadSkin};{Load;ErrorSkinIni.skin}}}}}"
В резервном skin.bu будут устаревшие настройки, но хотя-бы iCarDS автоматически запустится, без вмешательства человека.
Альтернативный вариант - использование
бекапера Backup_Tool. Но его надо запускать вручную. Хотя можно прописать его запуск в ONSKINSTART...