.386 .model flat,stdcall option casemap:none include \masm32\include\windows.inc include \masm32\include\user32.inc include \masm32\include\kernel32.inc include \masm32\include\shell32.inc includelib \masm32\lib\user32.lib includelib \masm32\lib\kernel32.lib includelib \masm32\lib\shell32.lib include \masm32\include\masm32.inc includelib \masm32\lib\masm32.lib include \masm32\include\comdlg32.inc includelib \masm32\lib\comdlg32.lib .data? ofn OPENFILENAME <> buffer db MAX_PATH dup(?) String db MAX_PATH dup(?) .data FileFilter db "All Files",0,"*.*",0 db "Text Files",0,"*.txt",0 db "Video Files",0,"*.avi;*.wmv;*.mkv;*.mpg;*.mpeg;*.mp4",0 db "Audio Files",0,"*.wav;*.mp3;*.flac;*.wma;*.ac3;*.ram;*.rm",0 db "Image Files",0,"*.iso;*.ima;*.img;*.imz;*.vdf;*.isz;*.bin;*.cue;*.nrg;*.mdf;*.mds;*.uif",0 db "Bitmap Files",0,"*.bmp;*.jpg;*.jpeg;*.png;*.gif;*.pcx;*.iff;*.psd;*.ras;*.rsb;*.sgi;*.tga;*.tiff",0 db "Archive Files",0,"*.zip;*.rar;*.gz;*.gzip;*.7z;*.cab;*.arj;*.jar",0 db 0 ;InitialDir db "C:\",0 WindowTitle db "Мой батничег",0 .code start: invoke GetCommandLine ; вызываем функцию командной строки в eax возврщается смещение Call MyProc ; проматываем до первого обратного слеша mov ebx, eax ; сохраним смещение на первый параметр mov ofn.lStructSize, sizeof ofn mov ofn.hwndOwner, NULL mov ofn.hInstance, NULL mov ofn.lpstrFilter, offset FileFilter mov ofn.lpstrCustomFilter, NULL mov ofn.nMaxCustFilter, NULL mov ofn.nFilterIndex, NULL ; определяет выбранный в настоящий момент фильтр для поля "Тип файлов" диалога mov ofn.lpstrFile, offset buffer mov ofn.nMaxFile, MAX_PATH mov ofn.lpstrFileTitle, NULL ; указатель на буфер, в котором находятся имя и расширение(без пути) выбранного файла mov ofn.nMaxFileTitle, NULL ; определяет размер буфера, на который указывает параметр lpstrFileTitle mov ofn.lpstrInitialDir, ebx ; указатель на строку, в которой определяется стартовая папка при открытии диалога. Если параметр имеет значение NULL, то система использует текущую папку как стартовую для этого диалога. mov ofn.lpstrTitle, offset WindowTitle ;NULL ; указатель на строку, которая будет помещена в заголовке окна диалога. Если этот параметр имеет значение NULL, то система использует стандартные заголовки (соответственно, "Сохранить как" или "Открыть") mov ofn.Flags, OFN_FILEMUSTEXIST or OFN_PATHMUSTEXIST or OFN_LONGNAMES or OFN_EXPLORER or OFN_HIDEREADONLY mov ofn.nFileOffset, NULL mov ofn.nFileExtension, NULL mov ofn.lpstrDefExt, NULL mov ofn.lCustData, NULL mov ofn.lpfnHook, NULL mov ofn.lpTemplateName, NULL invoke GetOpenFileName, ADDR ofn invoke CharToOem, addr buffer, addr String invoke StdOut,ADDR String ; invoke ExitProcess,eax ; выходим из программы, eax - код возврата MyProc proc ; подпрограмма разбора командной строки next: ; метка цикла cmp byte ptr[eax],'/' ; знак равен обратному слешу? je found ; если да выходим cmp byte ptr[eax],0 ; знак равен 0 - конец строки? jz esit ; если да выходим из подпрограммы inc eax ; увеличиваем смещение на 1 - переводим указатель на следующий знак jmp next ; в начало цикла found: mov byte ptr[eax], 0 ; заменяем обратный слеш на 0 - делитель строки inc eax ; переводим укзатель на следующий знак esit: Ret ; возвращаемся в программу MyProc endp end start ; конец ассемблирования |