|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
19.12.2018, 15:12 | #1 |
Регистрация: 24.11.2018
Сообщений: 6
|
Создание окна вывода в masm32
Есть код программы,нужно создать окно с выводом информации или сделать это через MessageBox.Подскажите ничего получается.
.386 .model flat, stdcall option casemap:none include\masm32\include\windows.inc include\masm32\include\kernel32.inc include\masm32\include\user32.inc includelib\masm32\lib\user32.lib includelib\masm32\lib\kernel32.lib .data ; Секцияданных buf db 500h dup(?) ; Буффер для имени директории fake1 db '.',0 ; Директории, которые fake2 db '..',0 ; НЕ надо сканировать time db 'temachka.jnt' .code ; Секция кода find_files proc ; Рекурсивная процедура ; Поиска файлов push ebp ; Выделим место в стеке mov ebp,esp ; под хэндл поиска sub esp,144h ; и структуру WIN32_FIND_DATA lea eax,[ebp-144h] ; Вычисляем указатель на find_data invoke FindFirstFile,offset buf,eax ; Ищем файлы inc eax ; Если ничего je exit ; не нашли - выходим dec eax ; Иначе, сохраним mov dword ptr [ebp-6h],eax ; хэндл поиска find_next: mov eax,dword ptr [ebp-144h] ; Проверяем, нашли and eax,FILE_ATTRIBUTE_DIRECTORY ; директорию? je found ; Если нет - прыгаем на found lea eax,[ebp-118h] ; Вычислим указатель на cFileName invoke lstrcmp,offset fake1,eax ; это "."? test eax,eax ; Если да, je next ; ищем дальше lea eax,[ebp-118h] ; Вычислим указатель на cFileName invoke lstrcmp,offset fake2,eax ; это ".."? test eax,eax ; Если да, je next ; ищем дальше invoke lstrlen,offset buf ; Вычислим длину строки sub eax,3 ; Вычтем *.* push eax ; Сохраним полученную длину mov byte ptr [buf+eax],0 ; Если мы всё-таки нашли lea eax,[ebp-118h] ; директорию, то прибавим invoke lstrcat,offset buf,eax ; к её имени c FileName invoke lstrlen,offset buf ; Вычислим длину строки mov dword ptr [buf+eax],'*.*\' ; Прибавим \*.* mov byte ptr [buf+eax+4],0 ; для поиска call find_files ; Вызываем процедуру поиска для найденной директории pop eax ; Восстановим дляну строки mov dword ptr [buf+eax-1],'*.*\' ; И восстановим \*.* mov byte ptr [buf+eax+3],0 ; jmp next ; Ищем дальше found: lea eax,[ebp-118h] ; Вычислим длину invoke lstrlen,eax ; cFileName cmp dword ptr [ebp-118h+eax-4],'zxy.' ; Проыерим расширение файла jne next ; Если не равно ищем дальше ;mov [ebp-118h],test lea eax,[ebp-118h] ; Если нашли, то что нужно invoke MessageBox,0,eax,eax,0 ; Покажем MessageBox с именем файла next: lea eax,[ebp-144h] ; Вычислим указатель на find_data invoke FindNextFile,dword ptr [ebp-6h],eax ; Ищем следующий файл test eax,eax ; jne find_next ; Если ничего не нашли invoke FindClose,dword ptr [ebp-6h] ; Закрываем хэндл поиска exit: leave ; Выходим из ret ; процедуры find_files endp start: invoke SetErrorMode,SEM_FAILCRITICALERRORS ; Установим error mode чтобы в случае обращения к недоступному диску не вываливалось сообщение invoke GetLogicalDrives ; Получаем список дисков существующих в системе mov ecx,25 ; Будем проверять, начиная с Z:\ find_drives: mov ebx,1 ; Нехитрые операции в shl ebx,cl ; ходе которых мы выясняем and ebx,eax ; присутсвует диск в je no_disk ; системе или нет add cl,65 ; Если да, то mov byte ptr buf,cl ; добавим букву sub cl,65 ; диска в буффер mov dword ptr buf+1,'.*\:' ; Сформируем строку mov byte ptr buf+5,'*' ; для поиска, вида, mov byte ptr buf+6,0 ; например, C:\*.* push eax ; Сохраняем нужные push ecx ; регистры в стеке call find_files ; Вызываем процедуру поиска pop ecx ; Восстанавливаем pop eax ; регистры no_disk: ; Если диска нет, dec ecx ; то проверяем следующий jge find_drives ; пока ecx>0 invoke ExitProcess,0 ; Выходим из программы end start |
19.12.2018, 15:14 | #2 |
Старожил
Регистрация: 15.02.2010
Сообщений: 15,707
|
|
19.12.2018, 16:08 | #3 |
Участник клуба
Регистрация: 16.06.2011
Сообщений: 1,428
|
Hichigo204, код нужно хоть как-то форматировать, а не выкладывать его как кучу навоза. Если лень привести его в нормальный вид, то будь добр объяснить, что именно тут происходит, и что нужно в итоге получить. А здесь непонятно что..
Нашедшего выход - затаптывают первым..
|
19.12.2018, 16:39 | #4 |
Регистрация: 24.11.2018
Сообщений: 6
|
это программа ищет файл в системе по заданому формату,при помощи API функций
1.Find_files - процедура, которая включает в себя алгоритм поиска файлов. FindFirstFile - поиск следующего файла, с него начинается поиск. FindClose - закрытие файла Использовании основные функции для работы со строками: - lstrcmp - сравнения - lstrlen - нахождение продлен - lstrcat - конкатинация (объединение срок) В коде вводится расширения, для поиска файла, и программа выводит все файлы с таким расширением которые смогла найти по всему компьютеру. 2. На экран выводится имя всех файлов которые были найдены с таким расширением. Программа начинает проверять, нашла ли она директорию , если так: Она заходит и начинает цикл снова; Заходит до тех пор пока не перейдет все директории и файлы в системе. Последний раз редактировалось Hichigo204; 19.12.2018 в 16:47. |
19.12.2018, 16:53 | #5 |
Старожил
Регистрация: 15.02.2010
Сообщений: 15,707
|
Почему в коде куча захардкоженных смещений? Почему не использовать поля структуры? Есть LOCAL, есть .if и прочее...
|
19.12.2018, 17:00 | #6 |
Регистрация: 24.11.2018
Сообщений: 6
|
я только учусь со структурами такое реализовать для меня трудновато,сделал как смог,код рабочий в дебагере смотрел, а запускаю exe ,программа работает но не выводит файлы или файл,вообще ничего
|
19.12.2018, 17:05 | #7 |
Участник клуба
Регистрация: 16.06.2011
Сообщений: 1,428
|
ну вот.. можно-же при желании растолковать..
FindFirstFile находит первый файл, а для продолжения нужно использовать уже FindNextFile. Первая возвратит тебе хэндл поиска, а вторая продлит поиск по этому хэндлу. Файлов может быть много, и буфер переполнится. Поэтому лучше выводить имена отдельно из каждого дира.
Нашедшего выход - затаптывают первым..
|
19.12.2018, 17:16 | #8 |
Регистрация: 24.11.2018
Сообщений: 6
|
а можно немного подробней растолковать,как это сделать
|
19.12.2018, 17:19 | #9 |
Старожил
Регистрация: 15.02.2010
Сообщений: 15,707
|
Именно так как вам сказали и написано в офф доке:
FindFirstFile do{}while(FindNextFile(h, &ffd) != 0) |
19.12.2018, 17:22 | #10 |
Регистрация: 24.11.2018
Сообщений: 6
|
Буду пробовать
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Несмотря на подключение masm32.inc и masm32.lib не подтягиваются функции stdin и stdout | dFender | Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM | 1 | 15.12.2016 13:24 |
Assembler под Windows (MASM32). Вывод массива в Edit диалогового окна используя WinAPI или функций MASM | munthrekosh | Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM | 1 | 04.06.2013 04:03 |
masm32 не модальные диалоговые окна, как гланые | Avizpr | Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM | 10 | 12.03.2013 14:05 |
masm32 - После создания окна оно закрывается:( | Wardrag | Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM | 9 | 23.08.2010 09:45 |