Victor_VG

Tracker Mod | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Особенности получения номера версии в ОС Windows. Ситуация: пакет обновлений (Сервис Пак) не установлен. Чем это грозит, и что мы должны сделать для устранения возможных ошибок? Используем простой тестовый скрипт (пример 1): Цитата: Outfile test.exe ShowInstDetails show Section "main" Version::GetWindowsVersion Pop $0 Pop $1 Pop $2 Pop $3 Pop $4 DetailPrint "$$0 == $0" DetailPrint "$$1 == $1" DetailPrint "$$2 == $2" DetailPrint "$$3 == $3" DetailPrint "$$4 == $4" SectionEnd | Его вызов в такой ситуации (использовалась ОС Windows 2000 в VirtualBox 3.14) даёт картину 1: где мы видим состояние регистров: R0 = 5 - версия системы, минор = 5, всё верно; R1 = маджор, неопределённое значение - "мусор", а мы ждём получения значения "0"; R2 = номер сборки, билд = 2195, всё верно; R3 = 3 = NT, тип платформы, WINNT, верно; R4 = неопределённое значение, CSID не известен, т.к. сервис пак не установлен. Эти значения возвращаются функцией GetVersionEx() из Kernel32.dll, но согласно MSDN данная функция не всегда возвращает числовое значение, иногда ей возвращаемое значение не определено и именно данная неопределённость приводит к ошибкам. "Мусор" это тот случай когда возвращаемая функцией структура содержит не определённые значение. Скорректируем их посредством следующего скрипта (пример 2): Цитата: Outfile test.exe ShowInstDetails show Section "main" Version::GetWindowsVersion Pop $0 StrCmp $0 "" +1 +2 StrCpy $0 0 Pop $1 StrCmp $1 "" +1 +2 StrCpy $1 0 Pop $2 StrCmp $2 "" +1 +2 StrCpy $2 0 Pop $3 StrCmp $3 "" +1 +2 StrCpy $3 0 Pop $4 StrCmp $4 "" +1 +2 StrCpy $4 0 DetailPrint "$$0 == $0" DetailPrint "$$1 == $1" DetailPrint "$$2 == $2" DetailPrint "$$3 == $3" DetailPrint "$$4 == $4" SectionEnd | и повторно протестируем пример: в итоге мы получим определённые значения всех элементов, так как там где функция вернула неопределённое значение мы сами поставили условный "0". И в заключение, работа обоих скриптов и пример 1 и пример 2 при запуске в ОС Windows XP SP3: Проверка под отладчиком (GNU GCC-4.4.1-TDM2(R4), отладчик gdb 7.1) подтвердила предположение, что функция GetVersionEx() возвращает в случае отсутствия пакета обновления или минорной части версии ОС неопределённое значение которое потом корректирует код ОС. На основании полученных данных я обновил библиотеку ProcLib.nsh до версии 2.7 в которую включил необходимые операции предотвращения ошибок. Она уже доступна на моём файл-сервере по этой ссылке в составе обновления для NSIS 2.46 ANSI скачать update.exe (10,3 Mb, начинайте качать браузером, потом кидайте в любую качалку, докачка поддерживается). Выкладывать её отдельно в следствии привязки к другим элементам обновления я пока не планирую.
---------- Жив курилка! (Р. Ролан, "Кола Брюньон") Xeon E5 2697v2/C602/128 GB PC3-14900L/GTX 1660 Ti, Xeon E5-2697v2/C602J/128 Gb PC3-14900L/GTX 1660 Ti |
| Всего записей: 35194 | Зарегистр. 31-07-2002 | Отправлено: 04:08 28-03-2010 | Исправлено: Victor_VG, 15:32 28-03-2010 |
|