Показать сообщение отдельно
Старый 26.01.2017, 14:56   #757
Lexx09
Старший Пользователь
 
Регистрация: 18.04.2009
Город: Краснодар
Регион: 23, 93
Машина: Приора хэтчбек
Сообщений: 869
Lexx09 has a brilliant futureLexx09 has a brilliant futureLexx09 has a brilliant futureLexx09 has a brilliant futureLexx09 has a brilliant futureLexx09 has a brilliant futureLexx09 has a brilliant futureLexx09 has a brilliant futureLexx09 has a brilliant futureLexx09 has a brilliant futureLexx09 has a brilliant future
По умолчанию

Словил ошибку "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:
    1. Если skin.ini в порядке, то срабатывает команда "_ONSKINSTART" и активируется окно "iCar DS".
    2. Если skin.ini поврежден, то он восстанавливается из файла skin.bak.
    3. Если skin.bak поврежден, то skin.ini восстанавливается из файла skin.chs.
    4. Если skin.chs поврежден, то skin.ini восстанавливается из файла skin.def.
    5. Если 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...
Вложения
Тип файла: rar skin.rar (392 байт, 81 просмотров)
__________________
Приора хэтчбек
ASRock B75M-ITX, Intel Pentium G640T Sandy Bridge 2x2.4GHz, DDR3 2x2Gb, SSD SmartBuy Ignition 64GB SATAIII, Win7 Ultimate x86, M2-ITX rev.2F, GPS VK-172 10Hz, Logitech Wireless Touch Keyboard K400r, ИК-пульт Prology RCD-350, круиз-контроль...

Последний раз редактировалось Lexx09; 27.01.2017 в 10:41.
Lexx09 вне форума   Ответить с цитированием