Здравствуйте. Я пишу код обрабатывающий параметры переданные юзером через командную строку. В случает неправильной передачи, я хочу вывести небольшую инструкцию на экран, как сделано в upx. Мои действия: GetCommandLine,AllocConsole,GetStdHandle,WriteConsole, FreeConsole Под Олли дебугом работает показывается все, что я запланиро- вал. Но как только запускаешь cmd и в ней пишешь свое прило- жение с неправильными параметреми(специально для проверки ко- да), то как будто бы оно быстро отрабатывает работу, но после себя никакого текста не оставляет! Если я в cmd напишу upx то выведется текст использования, как и мне в cmd вывести?
А почему у меня такое ощущение, что кое-кто win32 приложение закатал? Если так, Interrupt, аппликуха у тебя просто создает новую консоль и быренько завершается, а ты консольку не заметил Так что или линкуй консольное (/subsystem:console) либо находи хендл родительского приложения и пытайся аттачиться к его консоли
именно так! Если юзер запустил прогу с параметрами в командной, то запускается консольная часть, иначе гуи, которая начинается с создания диалгогового окна как основного. Вобщем я хочу универсальную, прогу сочетающую в себе и консольную и графический интерфейс, возможно ли это?
Пробуй Code (Text): .486 .model flat,STDCALL include \masm32\include\windows.inc include \masm32\include\masm32.inc include \masm32\include\gdi32.inc include \masm32\include\user32.inc include \masm32\include\kernel32.inc include \masm32\include\Comctl32.inc include \masm32\include\comdlg32.inc include \masm32\include\shell32.inc include \masm32\include\mpr.inc include \masm32\include\netapi32.inc include \masm32\include\wsock32.inc include \masm32\include\winmm.inc include \masm32\include\advapi32.inc includelib \masm32\lib\masm32.lib includelib \masm32\lib\gdi32.lib includelib \masm32\lib\user32.lib includelib \masm32\lib\kernel32.lib includelib \masm32\lib\Comctl32.lib includelib \masm32\lib\comdlg32.lib includelib \masm32\lib\shell32.lib includelib \masm32\lib\mpr.lib includelib \masm32\lib\advapi32.lib includelib \masm32\lib\winmm.lib includelib \masm32\lib\netapi32.lib includelib \masm32\lib\wsock32.lib .data ConsoleTitle db "xCD",0 _open db "Open",0 _close db "Close",0 szOpenDoor db "set cdaudio door open wait",0 szCloseDoor db "set cdaudio door closed wait", 0 _help db "Syntax:",0dh,0ah db 0dh,0ah db "xCD <cmd1>",0dh,0ah db 0dh,0ah db "<cmd1>:",0dh,0ah db " OPEN - Open CD-ROM",0dh,0ah db " CLOSE - Close CD-ROM",0dh,0ah,0 ind1 db 0 Num db 0 cm1 db "%s",0dh,0ah,"%s",0dh,0ah,"%s",0dh,0ah,"%s",0dh,0ah,"%s",0dh,0ah,"%s", 0dh,0ah,"%s",0 .data? cmdl dd ? hOut dd ? nWrite dd ? in0 db 256 dup (?) in1 db 256 dup (?) in2 db 256 dup (?) in3 db 256 dup (?) in4 db 256 dup (?) in5 db 256 dup (?) in6 db 256 dup (?) len dd ? ; length string outstring db 1000 dup (?) outstr1 db 1000 dup (?) .code start proc near invoke GetCommandLine mov cmdl,eax invoke AllocConsole invoke SetConsoleTitle,addr ConsoleTitle invoke GetStdHandle,STD_OUTPUT_HANDLE mov hOut,eax mov esi,cmdl call PRM invoke lstrcmpi,addr _open,addr in1 .if eax == 0 invoke mciSendString, addr szOpenDoor, 0, 0, 0 jmp end_CMD .endif invoke lstrcmpi,addr _close,addr in1 .if eax == 0 invoke mciSendString, addr szCloseDoor, 0, 0, 0 jmp end_CMD .endif mov esi,offset _help jmp output1 end_CMD: invoke GetLastError mov ebx,eax invoke FormatMessage,FORMAT_MESSAGE_FROM_SYSTEM,NULL,ebx,NULL,addr outstr1,MAX_PATH,NULL ;invoke wsprintf,addr outstring,addr cm1,addr in0,addr in1,addr in2,addr in3,addr in4,addr in5,addr in6 invoke CharToOem,addr outstr1,addr outstring mov esi,offset outstring output1: call outstr ;invoke FreeConsole invoke ExitProcess,NULL ret start endp outstr proc ; esi - string to out ; hOut HANDLE to out invoke lstrlen,esi invoke WriteConsole,hOut,esi,eax,addr nWrite,NULL ret outstr endp PRM PROC ; esi - string ; in1 - in6 - params w/o " invoke lstrlen,esi mov len,eax xor eax,eax mov Num,al mov ind1,al xor ebx,ebx ; for copy symb dec ebx mov edi,offset in0 xor ecx,ecx dec ecx mov al,'"' mov ah,20h l0: inc ecx cmp ecx,len jz s_end cmp byte ptr [esi+ecx],al jnz l1 not ind1 jmp l0 l1: cmp byte ptr [esi+ecx],ah jnz l2 cmp ind1,0 jnz l2 add edi,256 xor ebx,ebx dec ebx jmp l0 l2: inc ebx mov dl,byte ptr [esi+ecx] mov byte ptr [edi+ebx],dl jmp l0 s_end: ret PRM endp end start Конечно возможно.
А строку текста для вывода в консоль, как обычно завершать нулем? и учитываеть его в кол-ве выводимых символов?
Нет. Хотя удобнее написать функцию для вывода на консоль, которая сама определяет длину строки (по завершающему нулю)и затем вызывает WriteConsole. Ей можно будет передавать строки, длина которых заранее неизвестна, например, сгенерированных wsprintf.
Вот еще вопрос: Если я к примеру наберу cmd в тотал_командире, запустится cmd. Это приложение создаст консоль. Как мне узнать хэндл этой консоли?
1. [удалено из-за изменений в мировоззрении ] 2. AllocConsole не нужен т.к. консоль тебе создаст система
shoo Не плохо,но в коде где начинается гуи версия есть FreeConsole. Ой как не нравится что она мигает задним фоном(окно консоли) Плюс, когда в total commander на писал example.exe asdf > 1.txt то результирующий 1.txt стал в нуле!
> InitCommonControls вызывай А толку, в Iczelion`е написано, что эта функция нужна лишь для ссылке в импорте
понадобится вызывать до создания диалога при наличии там элементов типа прогресса и др., вх. в эту библиотеку, иначе диалог или не создастся ваще, или просто не будет этих контролов (если там где-то флаг выставить типа createAnyway - тчно не помню). блым консолью - щас перейду туда - почитаю хрен его знает - я консоли не писал, надо разобраться.
rmn Из исцелиона: "Вы можете вызвать comctl32.dll, поместив вызов функции IntiCommonControls в вашу программу. InitCommonControls - это функция в comctl32.dll, поэтому ее вызов в любом месте вашего кода заставит рE-загрузчик загрузить comctl32.dll, когда ваша программ запустится. Вам не нужно выполнять эту функцию, просто поместите ее где-нибудь. Эта функция ничего не делает!" урок 18.