Исходники.Ру - Программирование
Исходники
Статьи
Книги и учебники
Скрипты
Новости RSS
Магазин программиста

Ishodniki.Ru » Online книги » Visual Basic по шагам

Шаг 128 - Package & Deployment Wizard. Досадная ошибка

В разделе VB несколько шагов посвящено Package & Deployment Wizard. 

Я столкнулся с этой программой еще года 3 назад, и с тем, что она не работает...

После поисков нашел решение проблемы в Интернете, что и высылаю вам. 

К сожалению, ни имя автора, ни адрес сайта не сохранились. Может автор откликнется..

Гвоздев Ю.

С новой версией пакета 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!" и процесс установки завершается неудачно.

Варианты решения:

1. Перед запуском 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"

2. После работы P&D Wizard отредактировать файл setup.lst вручную, заменив при этом даты, имеющие формат, не воспринимаемый программой setup1.exe, на требуемый ("mm/dd/yy" или "mm/dd/yyyy")

3. Модифицировать исходный текст программы setup1.exe, перекомпилировать и подменить существующую версию на новую. Остановимся на этом варианте подробнее. Модификация Setup1.exe Модуль setup1.exe входит в состав дистрибутива, генерируемого P&D Wizard, и выполняет процедуру установки программы на клиентскую машину в соответствии со сценарием, описанным в setup.lst. Исходные тексты setup1.exe поставляются вместе с Visual Basic и находятся в папке "[Program Files]\Microsoft Visual Studio\VB98\Wizards\PDWizard\Setup1\". Для внесения изменений произведем следующие действия:

С помощью Microsoft Visual Basic откроем проект [Program Files]\Microsoft Visual Studio\VB98\Wizards\PDWizard\Setup1\Setup1.vbp. Откроем для редактирования модуль basSetup1 (файл setup1.bas). Внесем изменения в функцию 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 

Скомпилируем проект (File\Make Setup1.exe…) для создания нового модуля setup1.exe. Перенесем новый setup1.exe P&D Wizard'ом при создания дистрибутива). Теперь можно использовать P&D Wizard для создания дистрибутива на компьютере с разделителями даты/времени устанавливаемыми по умолчанию для России.

Заключение. Предложенный вариант решения проблемы не дает стопроцентной гарантии того, что программа инсталляции будет корректно обрабатывать файл setup.lst на любой машине клиента (при создании дистрибутива в качестве разделителя может быть указан практически любой символ, например, '?'). Hо вероятность того, что разделитель отличается от '/' или точки очень мала, а функция CDate ведет себя достаточно интеллектуально и распознает практически любой разумный формат даты. Для полного устранения ошибки необходимо исправить код P&D Wizard, а сделать это может только Microsoft.

Предыдущий шаг | Оглавление | Следующий шаг

Рассылка новостей
Рейтинги
© 2007, Программирование Исходники.Ру