Показать сообщение отдельно
Старый 26.01.2017, 14:56   #757
Lexx09
Старший Пользователь
 
Регистрация: 18.04.2009
Город: Краснодар
Регион: 23, 93
Машина: Приора хэтчбек
Сообщений: 977
Lexx09 has much to be proud ofLexx09 has much to be proud ofLexx09 has much to be proud ofLexx09 has much to be proud ofLexx09 has much to be proud ofLexx09 has much to be proud ofLexx09 has much to be proud ofLexx09 has much to be proud ofLexx09 has much to be proud ofLexx09 has much to be proud ofLexx09 has much to be proud of
По умолчанию

Словил ошибку "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 байт, 500 просмотров)
__________________
Приора хэтчбек
Win7 x64 Pro, Intel Core i3-3240 Ivy Bridge 2x3.4GHz HT, DDR3 2x4Gb, SSD SiliconPower Ace A55 128GB SATAIII, ASRock B75M-ITX, M2-ITX rev.2F, GPS Beitian BN-808, Logitech Wireless Touch Keyboard K400r, ИК-пульт Prology RCD-350, круиз-контроль...

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