FASM Прикрутить кнопку на стандартное окно...

Тема в разделе "WASM.BEGINNERS", создана пользователем rococo795, 16 дек 2016.

  1. Thetrik

    Thetrik UA6527P

    Публикаций:
    0
    Регистрация:
    25 июл 2011
    Сообщения:
    875
    Можно заюзать StrFormatByteSize64 , она сама делает всю работу.
    Numeric valueText string
    532532 bytes
    13401.30 KB
    2350623.5 KB
    24000162.40 MB
    24000000002.4 GB
     
    rococo795 нравится это.
  2. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.553
    Адрес:
    Russia
    Thetrik, кстати да, я и забыл про нее.
    Ну вот... теперь кое кому облегчили жизнь.
     
  3. rococo795

    rococo795 Active Member

    Публикаций:
    0
    Регистрация:
    1 дек 2016
    Сообщения:
    236
    Неужели это обо мне???? :mda:..... Да чтоб я.... да по лёгкому пути!!!! Да никогда!!!!:yu: Как нибудь внутрь функции залезу.... ... ... но потом.... :russian:
     
  4. rococo795

    rococo795 Active Member

    Публикаций:
    0
    Регистрация:
    1 дек 2016
    Сообщения:
    236
    Я тупой... Чем дальше, тем больше это понимаю..... Даже выкладывать на обозрение дебильный но рабочий код - стрёмно.... Прикреплю архивом...Может кто нибудь когда нибудь глянет и сделает из этого гуан - вполне себе нормальный кодес??? И выложит тут или архивом выложит..... А?
    Оооо... файл рар грузить нельзя.... Вот тогда ссылка... https://yadi.sk/d/0f14_r623DaLCv
     
  5. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.553
    Адрес:
    Russia
    rococo795,
    из того, что бросилось на первый взгляд.
    1) Вместо табов вставляйте пробелы (редакторы позволяют заменять табы на заданное количество пробелов.
    2) SchotchikHigh - что это? приколы РусЕнг )) ? ну что мешало написать англ слово "Counter"
    3) inc файлами , подпрограммы никто не вставляет. Научитесь писать функциями.
    4) ну и если хотите сообщения Русские выводить и файлы читать с русскими именами - пора вам перейти на Unicode
     
  6. rococo795

    rococo795 Active Member

    Публикаций:
    0
    Регистрация:
    1 дек 2016
    Сообщения:
    236
    TermoSINteZ,

    1. Понял...
    2. Ну да - так понятнее :blush:
    3. В смысле функциями?
    4. Да это я для себя... Показывать никому не собираюсь... Но.. Просто мысль такая - если уж частенько реальные проги показывают крякозяблы на разных виндах - то тут уверенный чёткий результат....:sad:

    Но главное - вроде башкой чёт вижу понимаю что можно сократить количество строк раза в три - а доехать не могу... я уж не говорю о оптимизации по скорости работы функций ну и ещё что там....
    Думал думал - как делать так чтобы в цикле иметь одну строчку, которая бы была видна только в определённые моменты... а так бы при работе цикла - пропускалась бы...
     
  7. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.553
    Адрес:
    Russia
    ....
    call MyFunctionForReading
    ...

    Ну а так, у вас много дублирующего кода. Ну сделать общую процедуру чтения для всех размеров файлов. Убрать все include в сорце (кроме заголовочного).
    include используются для объявлений. Код в них как правило не вставляют. Это моветон. Придерживайтесь классическому стилю программирования. Общая логика + вызовы функций
     
  8. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    rococo795,

    Не используйте регистр ebp никогда(как регистр общего назначения), он предназначен для формирования структуры стековых фреймов - реализует связь между процедурами.
    В общем у вас отсутствует рациональный так скажем подход. Код должен иметь структуру, так же и отдельные его компоненты. К примеру нужно как то отделять константы, переменные etc. Иначе приходится обращать внимание на контекст, где они использутся. К примеру LARGE_INTEGER это тип(структура), имя её вы используете для переменной, видимо того же типа :wacko:
    Конструкция cmp eax,INVALID_HANDLE_VALUE /je .errFilePointer должна быть оформлена как макрос, так как повторения этой конструкции сильно замусоривают код, что опять же делает его не читабельным.
     
  9. rococo795

    rococo795 Active Member

    Публикаций:
    0
    Регистрация:
    1 дек 2016
    Сообщения:
    236
    Indy_,

    Понял... Спасибо...
     
  10. rococo795

    rococo795 Active Member

    Публикаций:
    0
    Регистрация:
    1 дек 2016
    Сообщения:
    236
    Код где идут вычисления и запись сократился вдвое... Доехало в голове само - что не надо отдельно писать код для работы с файлами, которые меньше шага (выделенной памяти) и не нужно работа с файлами до 4 гигов..... - так как в процедуре работы с файлами больше 4 гигов - все эти шаги уже есть... перенаправил двумя строками и половина кода не нужна...
    ebp - исключил
    пример можно???
     
  11. rococo795

    rococo795 Active Member

    Публикаций:
    0
    Регистрация:
    1 дек 2016
    Сообщения:
    236
    Вот бы случилось чудо.... и .... появились бы строка как НЕ надо и как НАдо!!! Так нагляднее... :read:
     
  12. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    rococo795

    Я не помню как в фасме макросы дефейнить.
     
  13. rococo795

    rococo795 Active Member

    Публикаций:
    0
    Регистрация:
    1 дек 2016
    Сообщения:
    236
    Indy_,
    Понял....
     
  14. rococo795

    rococo795 Active Member

    Публикаций:
    0
    Регистрация:
    1 дек 2016
    Сообщения:
    236
    А куда l_inc -а дели??? Случаем не его в турму посадили в Испании или где там ещё....??? А то пишим тут пишим... А надо посылки собирать и отправлять!!!
     
  15. Thetrik

    Thetrik UA6527P

    Публикаций:
    0
    Регистрация:
    25 июл 2011
    Сообщения:
    875
    rococo795,
    Код (ASM):
    1. .if eax == INVALID_HANDLE_VALUE
    2. ; // do something
    3. .else
    4. ; // do something
    5. .endif
     
  16. rococo795

    rococo795 Active Member

    Публикаций:
    0
    Регистрация:
    1 дек 2016
    Сообщения:
    236
    Thetrik,

    Спасибо.... Подумаю...
     
  17. rococo795

    rococo795 Active Member

    Публикаций:
    0
    Регистрация:
    1 дек 2016
    Сообщения:
    236
    Проясните такой момент пожалуйста...
    1. Файл 10 гигов
    2. Выделяю для работы с ним памяти 500 Мб
    3. В файле нужно найти место - до которого потом буду записывать новый файл (то есть новое окончание файла)
    4. Практически всегда это место будет в конце исходного файла (то есть на последнем 20 ом чтении последней части исходного файла в память....
    Вопрос....
    Как правильно делать?
    1. Читаем файл по частям в память и проверяем каждую страницу (побайтно) на предмет совпадения с идентификатором\когда нашли (последняя страница) - то смотрим адрес до которого будем записывать\потом запускаем опять чтение и запись - до вычисленного нового размера.....
    2. Прочли первую страницу в память\прошлись по ней в поисках идентификатора\не нашли его и сразу записали эту страницу в новый файл... И так далее.... На последней странице - записываем не всю её - а только нужный размер....
     
  18. _edge

    _edge Well-Known Member

    Публикаций:
    1
    Регистрация:
    29 окт 2004
    Сообщения:
    631
    Адрес:
    Russia
    Верны оба варианта.

    В первом - оно дольше, но надежнее - потому что можно делать доп. проверки, и записать копию файла, только если все ОК. А во втором случае, если что-то не так с исходным файлом, получается будешь копировать вхолостую.

    Есть одна фраза, даже ставил ее ненадолго в подпись,
    "Если есть два способа, простой и сложный, то выбирай сложный, так как он проще простого способа, который тоже сложный, но ещё и кривой"

    :)
     
    Mikl___ нравится это.
  19. rococo795

    rococo795 Active Member

    Публикаций:
    0
    Регистрация:
    1 дек 2016
    Сообщения:
    236
    _edge,

    Принял к сведению... Спасибо...:boast:
     
  20. rococo795

    rococo795 Active Member

    Публикаций:
    0
    Регистрация:
    1 дек 2016
    Сообщения:
    236
    Код (ASM):
    1.  
    2. format PE GUI 4.0
    3. entry start    
    4.  
    5. include 'win32a.inc'
    6.  
    7. section '.bss' data readable writeable
    8. stime    SYSTEMTIME
    9. FileIn    dd ?    
    10. LARGE_INTEGER dq ?
    11. LARGE_INTEGER_LOW dd ?
    12. SchotchikHigh dd ?
    13. GetProcessHeapMem dd ?
    14. HeapAllocMem dd ?
    15. FileOut dd ?    
    16. cbRead dd ?      
    17. cbWrite dd ?    
    18.  
    19. section '.text' code readable executable
    20. start:  
    21.     invoke MessageBoxA,0,text,titl,0
    22.     invoke    GetLocalTime,stime
    23.     mov ax,[stime.wYear]      
    24.     cmp ax,$07e1          
    25.     jg .errData          
    26.     mov ax,[stime.wMonth]        
    27.     cmp ax,$0002
    28.     jg .errData
    29.     mov ax,[stime.wDay]      
    30.     cmp ax,$000a
    31.     jg .errData
    32.  
    33.     invoke CreateFile,lpFileIn,GENERIC_READ,0,0,3,0,0
    34.     cmp eax,-1
    35.     je .errlpFileIn
    36.     mov [FileIn],eax
    37.     invoke GetFileSizeEx,[FileIn],LARGE_INTEGER
    38.     mov eax,dword[LARGE_INTEGER]
    39.     mov [LARGE_INTEGER_LOW],eax
    40.     invoke GetProcessHeap
    41.     mov [GetProcessHeapMem],eax
    42.     invoke HeapAlloc,[GetProcessHeapMem],0,$06400000
    43.     cmp eax,0
    44.     je .errHeapAlloc  
    45.     mov [HeapAllocMem],eax
    46.     invoke CreateFile,lpFileOut,GENERIC_WRITE,2,0,1,0,0
    47.     cmp eax,-1
    48.     je .errlpFileOut
    49.     mov [FileOut],eax
    50.  
    51.     xor edi,edi
    52.     cmp dword[LARGE_INTEGER+4],0
    53.     ja .High;если больше
    54.     cmp dword[LARGE_INTEGER],$06400000
    55.     jbe .konec ;если меньше или равно
    56.     jmp .ups
    57. .High:
    58.     mov esi,dword[LARGE_INTEGER+4]
    59. .cikl2:
    60.     lea ebx,[SchotchikHigh]
    61.     invoke SetFilePointer,[FileIn],edi,ebx,0
    62.     cmp eax,INVALID_HANDLE_VALUE
    63.     je .errFilePointer ;если равно
    64.     invoke ReadFile,[FileIn],[HeapAllocMem],$06400000,cbRead,0
    65.     test eax,eax
    66.     jz .errReadFile  ;если ноль
    67.     invoke WriteFile,[FileOut],[HeapAllocMem],$06400000,cbWrite,0
    68.     test eax,eax
    69.     jz .errWriteFile  ;если ноль
    70.     add edi,$06400000 ; прыгнули на конец записанного массива - начало следующего
    71.     cmp edi,$0f9bfffff
    72.     jbe .cikl2 ; если ниже или равно
    73.     lea ebx,[SchotchikHigh]
    74.     invoke SetFilePointer,[FileIn],edi,ebx,0
    75.     cmp eax,INVALID_HANDLE_VALUE
    76.     je .errFilePointer ;если равно
    77.     invoke ReadFile,[FileIn],[HeapAllocMem],$06400000,cbRead,0
    78.     test eax,eax
    79.     jz .errReadFile  ;если ноль
    80.     invoke WriteFile,[FileOut],[HeapAllocMem],$06400000,cbWrite,0
    81.     test eax,eax
    82.     jz .errWriteFile  ;если ноль
    83.     inc    [SchotchikHigh]
    84.     mov eax,$0ffffffff
    85.     sub eax,edi
    86.     mov ecx,$06400000
    87.     sub ecx,eax
    88.     mov edi,ecx
    89.     dec edi
    90.     mov eax,[SchotchikHigh]
    91.     cmp eax,dword[LARGE_INTEGER+4]
    92.     jne .cikl2 ; если НЕ равно
    93.     cmp edi,dword[LARGE_INTEGER]
    94.     ja .konec ;если больше
    95. .ups:
    96.     sub [LARGE_INTEGER_LOW],edi
    97.     cmp [LARGE_INTEGER_LOW],$06400000
    98.     jb .kon  ; если меньше
    99.     lea ebx,[SchotchikHigh]
    100.     invoke SetFilePointer,[FileIn],edi,ebx,0
    101.     cmp eax,INVALID_HANDLE_VALUE
    102.     je .errFilePointer ;если равно
    103.     invoke ReadFile,[FileIn],[HeapAllocMem],$06400000,cbRead,0
    104.     test eax,eax
    105.     jz .errReadFile  ;если ноль
    106.     invoke WriteFile,[FileOut],[HeapAllocMem],$06400000,cbWrite,0
    107.     test eax,eax
    108.     jz .errWriteFile  ;если ноль
    109.     add edi,$06400000
    110.     mov eax,dword[LARGE_INTEGER]
    111.     mov [LARGE_INTEGER_LOW],eax
    112.     jmp .ups  
    113. .kon:
    114.     mov esi,[LARGE_INTEGER_LOW]
    115.     lea ebx,[SchotchikHigh]
    116.     invoke SetFilePointer,[FileIn],edi,ebx,0
    117.     cmp eax,INVALID_HANDLE_VALUE
    118.     je .errFilePointer ;если равно
    119.     invoke ReadFile,[FileIn],[HeapAllocMem],esi,cbRead,0
    120.     test eax,eax
    121.     jz .errReadFile  ;если ноль
    122.     invoke WriteFile,[FileOut],[HeapAllocMem],esi,cbWrite,0
    123.     test eax,eax
    124.     jz .errWriteFile  ;если ноль
    125.     jmp .Out
    126. .konec:
    127.     mov esi,dword[LARGE_INTEGER]
    128.     lea ebx,[SchotchikHigh]
    129.     invoke SetFilePointer,[FileIn],edi,ebx,0
    130.     cmp eax,INVALID_HANDLE_VALUE
    131.     je .errFilePointer ;если равно
    132.     invoke ReadFile,[FileIn],[HeapAllocMem],esi,cbRead,0
    133.     test eax,eax
    134.     jz .errReadFile  ;если ноль
    135.     invoke WriteFile,[FileOut],[HeapAllocMem],esi,cbWrite,0
    136.     test eax,eax
    137.     jz .errWriteFile  ;если ноль
    138. .Out:
    139.     invoke MessageBoxA,0,text9,titl,0      
    140.     jmp .exitFilePointer
    141.  
    142.     .errData:            invoke MessageBoxA,0,text1,titl,0      
    143.                         jmp .exitData
    144.     .errlpFileIn:        invoke MessageBoxA,0,text2,titl,0
    145.                         jmp .exitData
    146.     .errFileSize:        invoke MessageBoxA,0,text3,titl,0
    147.                         jmp .exitFileSize
    148.     .errHeapAlloc:        invoke MessageBoxA,0,text4,titl,0
    149.                         jmp .exitFileSize
    150.     .errlpFileOut:        invoke MessageBoxA,0,text5,titl,0
    151.                         jmp .exitFileOut
    152.     .errFilePointer:    invoke MessageBoxA,0,text6,titl,0
    153.                         jmp .exitFilePointer
    154.     .errReadFile:        invoke MessageBoxA,0,text7,titl,0
    155.                         jmp .exitFilePointer
    156.     .errWriteFile:        invoke MessageBoxA,0,text8,titl,0
    157.                         jmp .exitFilePointer
    158.     .errFilePointer1:    invoke MessageBoxA,0,textA,titl,0
    159.                         jmp .exitFilePointer
    160.  
    161. .exitFilePointer:    invoke CloseHandle,[FileOut]
    162. .exitFileOut:        invoke HeapFree,[GetProcessHeapMem],0,[HeapAllocMem]
    163. .exitFileSize:        invoke CloseHandle,[FileIn]
    164. .exitData:            invoke ExitProcess,0
    165.  
    166.  
    167. section '.data' data readable writeable
    168.  
    169.     lpFileIn    db 'C:\0\00.wav',0
    170.     lpFileOut    db 'C:\0\00(1).wav',0
    171.  
    172.     titl        db    'Vnimanie!!!',0
    173.     text        db    'Poprobuem wylechit wav   ',\
    174.                     '(pereimenuyite wav w 00.wav,  pologhite ego w papku  C:\0   ',\
    175.                     'Zapuskaem programku   Po okonchanii rabotyi sozdastsja fail  C:\0\00(1).wav) ',0
    176.     text1        db    'Wremja deistviya programmyi isteklo!!!  Zakanchiwayu rabotu',0
    177.     text2        db    'Net faila 00.wav v papke C:\0\  ili on zanyat drugim processom! Zakanchiwayu rabotu',0
    178.     text3        db    'Ne mogu opredelit razmer ishodnogo faila. Zakanchiwayu rabotu',0
    179.     text4        db    'Ne mogu wydelit pamyat.  Zakanchiwayu rabotu',0
    180.     text5        db    'Ne mogu sozdat 00(1).wav  Mogchet on ugche sozdan v C:\0 ?  Esli da - to udalite!  Zakanchiwayu rabotu',0
    181.     text6        db    'Ne mogu sdelat pryigchok w faile. Zakanchiwayu rabotu',0
    182.     text7        db    'Ne mogu prochitat fail w pamyat.  Zakanchiwayu rabotu',0
    183.     text8        db    'Ne mogu nachat zapis novogo faila.  Zakanchiwayu rabotu',0
    184.     text9        db    'OK!!!  Programma uspeschno zaverschila rabotu !!!',0
    185.     textA        db    'Ne mogu sdelat pryigchok w faile w cikle. Zakanchiwayu rabotu',0
    186.  
    187. section '.idata' import data readable
    188.   library kernel32,'kernel32.dll',\
    189.     user32,'user32.dll'
    190.  
    191.     include 'api\user32.inc'
    192.     include 'api\kernel32.inc'
    193.  
    Я клутой... кодес набросал... работает с файлами от 1 байта и до того размера что в 64 битах поместится... проверял на файлах размером 1 байт\88Мб\130Мб\1,5Гб\3,8Гб\4,7Гб\6Гб\12Гб ... всё работает...
    Просьба такая... Заоптимизируйте его по самое не балуйся в соответствии со всеми современными наворотами!!! Не понимаю я до поутя и про пуш и про аллигиан и про много чего.... В качестве расслабона от реальной работы - подмогните реальным рабочим кодесом...
     
    _edge нравится это.