div.main {margin-left: 20pt; margin-right: 20pt} 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 Studioreadmevb.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 StudioVB98WizardsPDWizardSetup1".
Для внесения изменений произведем
следующие действия:
1.C помощью Microsoft Visual Basic откроем
проект [Program Files]Microsoft Visual StudioVB98WizardsPDWizardSetup1Setup1.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.Скомпилируем проект (FileMake
Setup1.exe…) для создания нового модуля setup1.exe. 5.Перенесем
новый setup1.exe папку "...WizardsPDWizard" (именно
отсюда он берется P&D Wizard'ом при создания
дистрибутива). Теперь можно использовать
P&D Wizard для создания дистрибутива на
компьютере с разделителями даты/времени
устанавливаемыми по умолчанию для России.
Предложенный вариант
решения проблемы не дает стопроцентной
гарантии того, что программа инсталляции
будет корректно обрабатывать файл setup.lst на
любой машине клиента (при создании
дистрибутива в качестве разделителя может
быть указан практически любой символ,
например, '?'). Hо вероятность того, что
разделитель отличается от '/' или точки
очень мала, а функция CDate ведет себя
достаточно интеллектуально и распознает
практически любой разумный формат даты. Для
полного устранения ошибки необходимо
исправить код P&D Wizard, а сделать это может
только Microsoft.
|