install progress

Тема в разделе "WASM.WIN32", создана пользователем StPetr, 26 ноя 2004.

  1. StPetr

    StPetr New Member

    Публикаций:
    0
    Регистрация:
    13 ноя 2004
    Сообщения:
    8
    При написание инсталяционной программы возник вопрос: А как получить текущий прогресс инсталяции. В голову мне пришла одна мысль. Получать размер файла в папке установки , но функция 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.
     
  2. StPetr

    StPetr New Member

    Публикаций:
    0
    Регистрация:
    13 ноя 2004
    Сообщения:
    8
    Кстати если пойти путем разбития файла пострадает точность инсталляции или быстродействие, одно из двух.
     
  3. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Откуда берутся файлы для сохранения на диск?

    Я брал из ресурсов, использовал SizeofResource для привязки прогресса.
     
  4. NoName

    NoName New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2004
    Сообщения:
    1.229
    Выражу сугубо личное мнение.

    Если программа инсталляции будет копировать очень, ну просто ОЧЕНЬ большие файлы, то тогда progress bar нужен, иначе нет. А если требуется установить какую-нибудь мелочь, то тогда хватит обычной надписи.

    Допустим StPetr собрался писать программу, которая будет использоваться в разных вариациях, в таком случае могу посоветовать немного подумать, стоит ли писать ЭТО, когда созданы тысячи аналогов.
     
  5. StPetr

    StPetr New Member

    Публикаций:
    0
    Регистрация:
    13 ноя 2004
    Сообщения:
    8
    Да файлы берутся из ресурсов.

    javascript:paste_strinL(''+'cresta'+''+'\n',0)объясни мне по подробней как использовать SizeofResource.

    javascript:paste_strinL('
    Код (Text):
    1.           invoke    FindResource, NULL, IDR_MAIN_EXE, addr Main_Exe
    2. .IF eax != NULL
    3.     mov hResInfo_file_1, eax
    4.     invoke  LoadResource, NULL, hResInfo_file_1
    5.     .if eax != NULL
    6.         mov pRes_1, eax
    7.         invoke  SizeofResource, NULL, hResInfo_file_1
    8.         mov cb_file_1, eax
    9.         invoke  LockResource, hResInfo_file_1
    10.         invoke  lstrcat, ADDR folderbuffer, ADDR fName
    11.         invoke  CreateFile,OFFSET folderbuffer,GENERIC_WRITE,FILE_SHARE_DELETE or FILE_SHARE_WRITE or\
    12. FILE_SHARE_READ,0,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0
    13.         mov hFile,eax
    14.         invoke WriteFileEx,hFile,pRes_1,cb_file_1,OFFSET written,0
    15.         invoke CloseHandle,hFile
    ',0)

    Ведь при данном коде размер всегда будет одинаков. Что надо изменить?

    javascript:paste_strinL(''+'NoName'+''+'\n',0) стоит ради прогресса человечества.
     
  6. StPetr

    StPetr New Member

    Публикаций:
    0
    Регистрация:
    13 ноя 2004
    Сообщения:
    8
    Упс, я новичок в форуме.
     
  7. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    У меня туго с английским, сходу не разберусь, но в мсдн'е пишут, что WriteFileEx это асинхронная операция, возможно стоит обратить внимание на последний параметр ф-ции или прикрутить какой-то таймер-событие.
     
  8. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine




    Мне кажется, это плохая мысль и ресурсов можно бы избежать ... Размер файла то должен быть известен во время компиляции, пихай его в любое выравненное место, а потом скидывай обычным WriteFile кусками, вот и будет прогресс. А что на счет упаковки?
     
  9. volodya

    volodya wasm.ru

    Публикаций:
    0
    Регистрация:
    22 апр 2003
    Сообщения:
    1.169
    А зачем изобретать велосипед, если есть MSI?
     
  10. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    StPetr



    Ну примерно так делал: есть 2 глобальных переменных BytesSaved и BytesTotal. Перед началом выгрузки файлов на винт они = 0. По нажатию кнопки "Старт" просматриваются все ресурсы и суммируется их величина. Эта сумма записывается в BytesTotal. Затем запускается цикл, в котором из ресурсов достаются по очереди файлы и определяется их размер (каждого отдельно). После выгрузки файла на винт переменная BytesSaved увеличивается на величину размера ресурса. И так по мере сохранения файлов на винт, эта переменная всё время растет. От нуля до суммы всех файлов (BytesTotal).

    Параллельно с запуском цикла сохранения запускается отдельный thread, в котором считывается величина BytesSaved, и в соответствии с её величиной рисуется прогресс. Вернее в соответствии с отношением BytesSaved/BytesTotal. Достаточно просто...
     
  11. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257




    Пользовался SetupGenerator'ом, пока он не взбрыкнул и при деинсталляции не удалил регистрацию в реестре у кучи файла, пришлось косить винду :dntknw: Вот тебе и аналог. Про свой знаю наверняка: он не удалит регистрацию. Не заложено в нем это :).







    Пока с его скриптами разберёшься, быстрее свой инсталлятор написать, имхо. Да и приятней со своим инсталлировать. И заодно чему-то новому научился.
     
  12. volodya

    volodya wasm.ru

    Публикаций:
    0
    Регистрация:
    22 апр 2003
    Сообщения:
    1.169
    Да и приятней со своим инсталлировать.



    Кому приятней? Тебе?
     
  13. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Да. Я понимаю, что ты возразишь: надо чтобы было приятно пользователю, но поверь, я у троих устанавливал им (немного, но тем не менее), и народ был вполне доволен, и отрицательных эмоций не наблюдалось :) Один даже не поверил, что это я соорудил...
     
  14. StPetr

    StPetr New Member

    Публикаций:
    0
    Регистрация:
    13 ноя 2004
    Сообщения:
    8
    javascript:paste_strinL('Мне кажется, это плохая мысль и ресурсов можно бы избежать ... Размер файла то должен быть известен во время компиляции, пихай его в любое выравненное место, а потом скидывай обычным WriteFile кусками, вот и будет прогресс. А что на счет упаковки?',0)



    Да скорее всего я воспользуюсь этим методом.

    До упаковки пока не кодил.



    javascript:paste_strinL('Ну примерно так делал: есть 2 глобальных переменных BytesSaved и BytesTotal. Перед началом выгрузки файлов на винт они = 0. По нажатию кнопки "Старт" просматриваются все ресурсы и суммируется их величина. Эта сумма записывается в BytesTotal. Затем запускается цикл, в котором из ресурсов достаются по очереди файлы и определяется их размер (каждого отдельно). После выгрузки файла на винт переменная BytesSaved увеличивается на величину размера ресурса. И так по мере сохранения файлов на винт, эта переменная всё время растет. От нуля до суммы всех файлов (BytesTotal).

    Параллельно с запуском цикла сохранения запускается отдельный thread, в котором считывается величина BytesSaved, и в соответствии с её величиной рисуется прогресс. Вернее в соответствии с отношением BytesSaved/BytesTotal. Достаточно просто...
    ',0)



    Просто, но если в ресурсах всего будет один бооольшой файл. Прогресс будет стоять на месте и лишь когда файл скопируется он окажется в конце. Этот способ не подходит.
     
  15. StPetr

    StPetr New Member

    Публикаций:
    0
    Регистрация:
    13 ноя 2004
    Сообщения:
    8
    Что за баги в форуме "javascript:paste_strinL".

    Руки у меня вроде бы прямые.
     
  16. volodya

    volodya wasm.ru

    Публикаций:
    0
    Регистрация:
    22 апр 2003
    Сообщения:
    1.169
    Что за баги в форуме "javascript:paste_strinL".





    Так таки у тебя руки кривые :)
     
  17. StPetr

    StPetr New Member

    Публикаций:
    0
    Регистрация:
    13 ноя 2004
    Сообщения:
    8
    "Так таки у тебя руки кривые :)"



    Не просто ваш форум не совместим с "Оперой 7.23".
     
  18. NoName

    NoName New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2004
    Сообщения:
    1.229
    ОФФТОП. Скорее опера несовместима с форумом, чем форум с оперой.