.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 .data? PATH db MAX_PATH dup(?) String db MAX_PATH dup(?) brinfo BROWSEINFO <> mestitle dd ? ;StringLen dd ? .data ;OKButton db 12h, 04h, 4Bh, 04h, 31h, 04h, 40h, 04h, 30h, 04h, 42h, 04h, 4Ch, 04h, 0, 0 .code start: invoke GetCommandLine ; вызываем функцию командной строки в eax возврщается смещение Call MyProc ; проматываем до первого обратного слеша mov ebx, eax ; сохраним смещение на первый параметр Call MyProc ; проматываем до второго слеша mov mestitle, eax ; сохраним смещениена второйпараметр ; заполним BROWSEINFO структуру mov brinfo.hwndOwner, 0 ; хендл родительского окна, здесь - ноль. mov brinfo.pidlRoot,0 ; PIDL - характеризует корневую папку с которой начинается обзор mov brinfo.pszDisplayName, offset PATH ; указатель строки выбранного пути mov brinfo.lpszTitle, ebx ; указатель строки которая выводится над окном дерева папок mov brinfo.ulFlags, BIF_RETURNONLYFSDIRS; BIF_USENEWUI ; флаги которые определяют функции и вид диалогового окна mov brinfo.lpfn, BrowseCallbackProc ; указатель пользовательской функции события, которую вызывает диалоговое окно mov brinfo.lParam, NULL ; An application-defined value that the dialog box passes to the callback function, if one is specified in lpfn. mov brinfo.iImage, NULL ; An integer value that receives the index of the image associated with the selected folder, stored in the system image list. invoke SHBrowseForFolder, ADDR brinfo ; вызываем функцию окна выбора папки .IF eax!=0 ; 0 - ничего не выбрано push eax ; сохраним ID папки invoke SHGetPathFromIDList,eax,addr PATH ; конвертируем ID в путь invoke CharToOem, addr PATH, addr String ; меняем кодировку строки пути invoke lstrlen,addr PATH lea ebx, String add ebx,eax mov byte ptr[ebx],0Dh inc ebx mov byte ptr[ebx],0Ah inc ebx mov byte ptr[ebx],0 invoke StdOut,ADDR String pop eax ; вытащим ID папки .ENDIF invoke ExitProcess,eax ; выходим из программы, eax - код возврата BrowseCallbackProc proc hwnd:DWORD,uMsg:DWORD,lParam:DWORD,lpData ; подпрограмма диалогового окна выбора папки .IF uMsg==BFFM_INITIALIZED ; invoke SendMessage,hwnd,BFFM_SETOKTEXT,NULL,addr OKButton ; меняем текст на кнопке ОК (юникод) invoke SetWindowText,hwnd,mestitle ; меняем заголовок окна .ENDIF xor eax,eax ret BrowseCallbackProc endp 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 ; конец ассемблирования ; ассемблирование ;C:\masm32\bin\ml.exe /c /coff current.asm ;C:\masm32\bin\link.exe /subsystem:console current.obj http://www.masm32.com/masmdl.htm |