При написание инсталяционной программы возник вопрос: А как получить текущий прогресс инсталяции. В голову мне пришла одна мысль. Получать размер файла в папке установки , но функция WriteFile создает файл только полного его копирования из буфера. Как быть? Может разбить по частям? На данный момент исходник выглядит так: при нажитии на кнопку запускаются две ветви 1-я ветвь: invoke GetFileSize,hFile,NULL 2-я ветвь: invoke CreateFile,OFFSET folderbuffer,GENERIC_WRITE,FILE_SHARE_DELETE or FILE_SHARE_WRITE or FILE_SHARE_READ,0,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0 mov hFile,eax invoke WriteFileEx,hFile,pRes_1,cb_file_1,OFFSET written,0 Примечание: Первая ветьвь выполняется только после того как во второй ветви выполнится функция WriteFile.
Кстати если пойти путем разбития файла пострадает точность инсталляции или быстродействие, одно из двух.
Откуда берутся файлы для сохранения на диск? Я брал из ресурсов, использовал SizeofResource для привязки прогресса.
Выражу сугубо личное мнение. Если программа инсталляции будет копировать очень, ну просто ОЧЕНЬ большие файлы, то тогда progress bar нужен, иначе нет. А если требуется установить какую-нибудь мелочь, то тогда хватит обычной надписи. Допустим StPetr собрался писать программу, которая будет использоваться в разных вариациях, в таком случае могу посоветовать немного подумать, стоит ли писать ЭТО, когда созданы тысячи аналогов.
Да файлы берутся из ресурсов. javascript:paste_strinL(''+'cresta'+''+'\n',0)объясни мне по подробней как использовать SizeofResource. javascript:paste_strinL(' Код (Text): invoke FindResource, NULL, IDR_MAIN_EXE, addr Main_Exe .IF eax != NULL mov hResInfo_file_1, eax invoke LoadResource, NULL, hResInfo_file_1 .if eax != NULL mov pRes_1, eax invoke SizeofResource, NULL, hResInfo_file_1 mov cb_file_1, eax invoke LockResource, hResInfo_file_1 invoke lstrcat, ADDR folderbuffer, ADDR fName invoke CreateFile,OFFSET folderbuffer,GENERIC_WRITE,FILE_SHARE_DELETE or FILE_SHARE_WRITE or\ FILE_SHARE_READ,0,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0 mov hFile,eax invoke WriteFileEx,hFile,pRes_1,cb_file_1,OFFSET written,0 invoke CloseHandle,hFile ',0) Ведь при данном коде размер всегда будет одинаков. Что надо изменить? javascript:paste_strinL(''+'NoName'+''+'\n',0) стоит ради прогресса человечества.
У меня туго с английским, сходу не разберусь, но в мсдн'е пишут, что WriteFileEx это асинхронная операция, возможно стоит обратить внимание на последний параметр ф-ции или прикрутить какой-то таймер-событие.
Мне кажется, это плохая мысль и ресурсов можно бы избежать ... Размер файла то должен быть известен во время компиляции, пихай его в любое выравненное место, а потом скидывай обычным WriteFile кусками, вот и будет прогресс. А что на счет упаковки?
StPetr Ну примерно так делал: есть 2 глобальных переменных BytesSaved и BytesTotal. Перед началом выгрузки файлов на винт они = 0. По нажатию кнопки "Старт" просматриваются все ресурсы и суммируется их величина. Эта сумма записывается в BytesTotal. Затем запускается цикл, в котором из ресурсов достаются по очереди файлы и определяется их размер (каждого отдельно). После выгрузки файла на винт переменная BytesSaved увеличивается на величину размера ресурса. И так по мере сохранения файлов на винт, эта переменная всё время растет. От нуля до суммы всех файлов (BytesTotal). Параллельно с запуском цикла сохранения запускается отдельный thread, в котором считывается величина BytesSaved, и в соответствии с её величиной рисуется прогресс. Вернее в соответствии с отношением BytesSaved/BytesTotal. Достаточно просто...
Пользовался SetupGenerator'ом, пока он не взбрыкнул и при деинсталляции не удалил регистрацию в реестре у кучи файла, пришлось косить винду Вот тебе и аналог. Про свой знаю наверняка: он не удалит регистрацию. Не заложено в нем это . Пока с его скриптами разберёшься, быстрее свой инсталлятор написать, имхо. Да и приятней со своим инсталлировать. И заодно чему-то новому научился.
Да. Я понимаю, что ты возразишь: надо чтобы было приятно пользователю, но поверь, я у троих устанавливал им (немного, но тем не менее), и народ был вполне доволен, и отрицательных эмоций не наблюдалось Один даже не поверил, что это я соорудил...
javascript:paste_strinL('Мне кажется, это плохая мысль и ресурсов можно бы избежать ... Размер файла то должен быть известен во время компиляции, пихай его в любое выравненное место, а потом скидывай обычным WriteFile кусками, вот и будет прогресс. А что на счет упаковки?',0) Да скорее всего я воспользуюсь этим методом. До упаковки пока не кодил. javascript:paste_strinL('Ну примерно так делал: есть 2 глобальных переменных BytesSaved и BytesTotal. Перед началом выгрузки файлов на винт они = 0. По нажатию кнопки "Старт" просматриваются все ресурсы и суммируется их величина. Эта сумма записывается в BytesTotal. Затем запускается цикл, в котором из ресурсов достаются по очереди файлы и определяется их размер (каждого отдельно). После выгрузки файла на винт переменная BytesSaved увеличивается на величину размера ресурса. И так по мере сохранения файлов на винт, эта переменная всё время растет. От нуля до суммы всех файлов (BytesTotal). Параллельно с запуском цикла сохранения запускается отдельный thread, в котором считывается величина BytesSaved, и в соответствии с её величиной рисуется прогресс. Вернее в соответствии с отношением BytesSaved/BytesTotal. Достаточно просто...',0) Просто, но если в ресурсах всего будет один бооольшой файл. Прогресс будет стоять на месте и лишь когда файл скопируется он окажется в конце. Этот способ не подходит.