Khachkara » 03.05.2009 (Вс) 23:36
Package & Deployment Wizard. Досадная ошибка.
С новой версией пакета Microsoft Visual Basic 6.0 поставляется Package & Deployment Wizard, предназначенный для создания инсталляционных пакетов на основе проекта Visual Basic.
В сравнении со своим хорошо известным предшественником - Setup Wizard, P&D Wizard предоставляет новую функциональность, но, к сожалению, новый инструмент содержит некоторые досадные ошибки.
Проблемы использования:
Итак, Вы решили создать с помощью P&D Wizard инсталляционный пакет типа "Standart Setup Package". Wizard отработал отлично и сгенерировал дистрибутив (setup.exe, setup.lst и один/несколько .cab-файлов), но при попытке запуска пользователем setup.exe из созданного Вами дистрибутива, выдается ошибка "Invalid line in setup information file!";. Если Вы сталкивались с подобной ситуацией, то, скорее всего, дело в следующем. Hа Вашем компьютере (там, где запускался P&D Wizard) настройки разделителей даты/времени отличаются от оригинальных американских ('/' - для даты, ':' - для времени). Hапомню, что данные настройки задаются в Control Panel/Regional Settings (Панель управления/Язык и стандарты).
Поскольку для России разделителем даты по умолчанию является точка ('.'), описанная проблема обнаруживается довольно быстро. Причина возникновения ошибки проста. При создании дистрибутива P&D Wizard генерирует текстовый файл setup.lst и сохраняет в нем информацию о дате и времени последней модификации распространяемых файлов. Дата и время сохраняются с учетом текущих системных разделителей. Программа установки setup.exe, запускаемая пользователем, выполняет разбор setup.lst и при этом ожидает, что дата сохранена в американском формате. Если формат даты не совпадает с ожидаемым, то возникает ошибка "Invalid line in setup information file!" и процесс установки завершается неудачно.
Варианты решения:
Для решения указанной проблемы можно предложить несколько вариантов: Перед запуском P&D Wizard изменить системные настройки (разделители) таким образом, чтобы Short date style имел вид "mm/dd/yy" или "mm/dd/yyyy"; запустить P&D Wizard для генерации дистрибутива; восстановить настройки в Regional Settings. Этот способ рекомендован Microsoft и описан в readme для VB (файл "[Program Files]\Microsoft Visual Studio\readmevb.htm") в разделе "Package and Deployment Wizard: Bad Date and Time Formats" После работы P&D Wizard отредактировать файл setup.lst вручную, заменив при этом даты, имеющие формат, не воспринимаемый программой setup1.exe, на требуемый ("mm/dd/yy" или "mm/dd/yyyy") Модифицировать исходный текст программы setup1.exe, перекомпилировать и подменить существующую версию на новую.
Остановимся на этом варианте подробнее. Модификация Setup1.exe Модуль setup1.exe входит в состав дистрибутива, генерируемого P&D Wizard, и выполняет процедуру установки программы на клиентскую машину в соответствии со сценарием, описанным в setup.lst. Исходные тексты setup1.exe поставляются вместе с Visual Basic и находятся в папке "[Program Files]\Microsoft Visual Studio\VB98\Wizards\PDWizard\Setup1\". Для внесения изменений произведем следующие действия:
1.C помощью Microsoft Visual Basic откроем проект [Program Files]\Microsoft Visual Studio\VB98\Wizards\PDWizard\Setup1\Setup1.vbp
2.Откроем для редактирования модуль basSetup1 (файл setup1.bas)
3.Внесем изменения в функцию ParseDateTime() Оригинальная функция ParseDateTime() имеет вид:
Function ParseDateTime(ByVal strDateTime As String) As Date
Dim Var As Variant
Var = strDateTime
If 0 = VariantChangeTypeEx(VarPtr(Var), VarPtr(Var), &H409, 0, vbDate) Then
ParseDateTime = Var Else 'Raise same error as CDate
Err.Raise 13
End If
End Function
Функция ParseDateTime() производит перевод даты из строки в тип Date посредством вызова функции API VariantChangeTypeEx(). В данном случае, VariantChangeTypeEx делает попытку привести Variant-переменную к типу Date без учета установок в Regional Settings, и, соответственно, требует жесткого соблюдения формата записи даты в файле setup.lst ("mm/dd/yy" или "mm/dd/yyyy"). Поскольку P&D Wizard не придерживается этого правила, функция VariantChangeTypeEx() не всегда отрабатывает успешно.
Используем для преобразования строки в дату функцию СDate. Эта функция работает более гибко и позволяет использовать в качестве аргумента строку с различными видами разделителей (точка, запятая, '/'). Приведем функцию ParseDateTime() к виду:
Function ParseDateTime(ByVal strDateTime As String) As Date
ParseDateTime=CDate(strDateTime)
End Function
4.Скомпилируем проект (File\Make Setup1.exe?) для создания нового модуля setup1.exe. 5.Перенесем новый setup1.exe папку "...\Wizards\PDWizard\"
(именно отсюда он берется P&D Wizard'ом при создания дистрибутива). Теперь можно использовать P&D Wizard для создания дистрибутива на компьютере с разделителями даты/времени устанавливаемыми по умолчанию для России.
Заключение Предложенный вариант решения проблемы не дает стопроцентной гарантии того, что программа инсталляции будет корректно обрабатывать файл setup.lst на любой машине клиента (при создании дистрибутива в качестве разделителя может быть указан практически любой символ, например, '?'). Hо вероятность того, что разделитель отличается от '/' или точки очень мала, а функция CDate ведет себя достаточно интеллектуально и распознает практически любой разумный формат даты. Для полного устранения ошибки необходимо исправить код P&D Wizard, а сделать это может только Microsoft.
P.S. В дополнение к сказанному остается добавить, что все исправления в sertup1.exe внесены, заодно русифицированны ресурсы, входящие в этот файл. Так что скачивайте, и наслождайтесь (исходники входят в архив).
Я новичок в VB, к тому же еще самоучка, прошу сильно не ругать.