semiono
Интересующийся
Offline
|
|
« : 02-10-2010 21:58 » |
|
Hello World! Мне нужно написать эмуляцию батника. (fasm, masm32... дальше лучше не надо...)
%WinDir%\system32\ml.cmd: %SystemDrive%\masm32\bin\ml.exe %*
Хочу обратить внимание на %* ввод параметров не програмно! Запуск из консоли не должен открывать новую консоль. Пример может быть любым, не обязательно ml.exe. Но приложение интересует консольное с параметрами.
invoke ShellExecute, тут не подходит, ShellExecuteEx может быть, но я не компитентный тут. Возможно тут может понадобиться WaitForSingleObject() ?
в общем помогите.
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #1 : 03-10-2010 03:47 » |
|
ShellExecuteEx позволяет получить хендл запущенного приложения и отслеживать, когда приложение завершится (и вроде даже можно отключить создание новой консоли, но сейчас некогда детально копаться - смотри МСДН) вот я недавно себе делал функцию для запуска и получения хендла приложения bool st_ShellExecuteEx(const char* filepath,HANDLE& hModule,int show) { static bool bCoInitWas=false; if(!bCoInitWas) { bCoInitWas=true; if(S_OK!=CoInitializeEx(0,COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE)) { std::cout<<"Не удалось выполнить CoInitializeEx()"<<std::endl; } }
hModule=0; if(!filepath)return false;
SHELLEXECUTEINFO ExecInfo; memset(&ExecInfo,0,sizeof(ExecInfo)); ExecInfo.cbSize=sizeof(ExecInfo); ExecInfo.fMask=SEE_MASK_NOCLOSEPROCESS|SEE_MASK_NOASYNC; ExecInfo.lpVerb="open"; ExecInfo.lpFile=filepath; ExecInfo.nShow=show;
if(!ShellExecuteEx(&ExecInfo)) { return false; }
hModule=ExecInfo.hProcess;
return true; }
а ожидать завершения приложения можно так //ждём окончания работы сканера или таймаут 5000 мс DWORD dwd=WaitForSingleObject(hModule,5000) ;
//WAIT_TIMEOUT - по таймауту //WAIT_OBJECT_0 - по завершению приложения
|
|
|
Записан
|
|
|
|
resource
Молодой специалист
Offline
Пол:
|
|
« Ответ #2 : 03-10-2010 05:14 » |
|
Алексей1153++, я так понимаю, что этот код static bool bCoInitWas=false; if(!bCoInitWas) { bCoInitWas=true; if(S_OK!=CoInitializeEx(0,COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE)) { std::cout<<"Не удалось выполнить CoInitializeEx()"<<std::endl; } } ты просто удалить забыл? Еще возможно нужен флаг SEE_MASK_NO_CONSOLE. semiono, после того как дождешься завершения процесса, не забывай закрывать полученный хэндл. ЗЫ топик только получился не про асм
|
|
« Последнее редактирование: 03-10-2010 05:17 от resource »
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #3 : 03-10-2010 12:16 » |
|
|
|
|
Записан
|
|
|
|
resource
Молодой специалист
Offline
Пол:
|
|
« Ответ #4 : 03-10-2010 14:47 » |
|
Если вкраце, они там пишут, что если нужен COM (не совсем так конечно), то надо его инициализировать, а иначе не надо. И якобы это хорошая практика, всегда так делать. в общем не стоит принимать близко к сердцу. Да и код у них там приведен монстроузный, однако заметь, сами-то они не вызывают CoInitializeEx (хитрые). В локальной версии, про это вообще ничего нет. И про ОСи на которых реализована эта функция, тоже приврали. Написано, что XP нужен, а в локальной МСДН написано Windows NT 4.0, Windows 95 (и это больше похоже на правду).
|
|
|
Записан
|
|
|
|
semiono
Интересующийся
Offline
|
|
« Ответ #5 : 03-10-2010 17:48 » |
|
Спасибо попытаюсь понять. Только я C++ читаю с огромным непониманием. ЗЫ топик только получился не про асм Угу. Ну зато хоть что-то.
|
|
|
Записан
|
|
|
|
RXL
|
|
« Ответ #6 : 03-10-2010 18:52 » |
|
semiono, C/C++ читать и понимать намного легче, чем ассемблер, но логика от этого не страдает. Эти языки легко переводятся в ассемблер - достаточно попросить компилятор сделать это.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
semiono
Интересующийся
Offline
|
|
« Ответ #7 : 12-10-2010 19:31 » |
|
sh: invoke GetStdHandle,STD_INPUT_HANDLE mov [stdi],eax mov [sinfo.hStdInput],eax
invoke GetStdHandle,STD_OUTPUT_HANDLE mov [stdo],eax mov [sinfo.hStdOutput],eax
invoke GetCommandLine mov [sci],eax
mov [sinfo.cb],sizeof.STARTUPINFO mov [sinfo.dwFlags],STARTF_USEPOSITION;+STARTF_USESIZE ;STARTF_USESTDHANDLES mov dword [sinfo.dwX],0 mov dword [sinfo.dwY],0 ;mov dword [sinfo.dwXSize],0x50 ;mov dword [sinfo.dwYSize],0x19
invoke ExpandEnvironmentStrings,'%ProgramFiles%\Far\Far.exe',exec,MAX_PATH invoke CreateProcess,exec,[sci],NULL,NULL,\ CREATE_NEW_CONSOLE,NORMAL_PRIORITY_CLASS,NULL,NULL,sinfo,pinfo ;DETACHED_PROCESS cmp eax,NULL je exit
invoke WaitForSingleObject,[pinfo.hProcess],INFINITE ; INFINITE dd 0xffffffff exit: Почему окно фар.exe тупо открывается как и прежде, почему sinfo.dwX = 0 игнорирует? Я что-то забыл заполнить?
|
|
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #8 : 12-10-2010 21:44 » |
|
bInheritHandles и dwCreationFlags
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
semiono
Интересующийся
Offline
|
|
« Ответ #9 : 14-10-2010 13:51 » |
|
bInheritHandles имеет два значения TRUE/FALSE, это даже фасм понимает, dwCreationFlags не все флаги описаны в фасм, поэтому я двордами прошёлся 0x01000000, 0x04000000, 0x00000010, опять же тишина!
|
|
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #10 : 14-10-2010 16:07 » |
|
BOOL WINAPI CreateProcess( __in_opt LPCTSTR lpApplicationName, __inout_opt LPTSTR lpCommandLine, __in_opt LPSECURITY_ATTRIBUTES lpProcessAttributes, __in_opt LPSECURITY_ATTRIBUTES lpThreadAttributes, __in BOOL bInheritHandles, __in DWORD dwCreationFlags, __in_opt LPVOID lpEnvironment, __in_opt LPCTSTR lpCurrentDirectory, __in LPSTARTUPINFO lpStartupInfo, __out LPPROCESS_INFORMATION lpProcessInformation );
__in_opt LPCTSTR lpApplicationName, | __inout_opt LPTSTR lpCommandLine, | __in_opt LPSECURITY_ATTRIBUTES lpProcessAttributes, | __in_opt LPSECURITY_ATTRIBUTES lpThreadAttributes, | __in BOOL bInheritHandles, | __in DWORD dwCreationFlags, | __in_opt LPVOID lpEnvironment, | __in_opt LPCTSTR lpCurrentDirectory, | __in LPSTARTUPINFO lpStartupInfo, | __out LPPROCESS_INFORMATION lpProcessInformation | exec, | [sci], | NULL, | NULL, | CREATE_NEW_CONSOLE, | NORMAL_PRIORITY_CLASS, | NULL, | NULL, | sinfo | pinfo |
dwCreationFlags [in] The flags that control the priority class and the creation of the process. For a list of values, see Process Creation Flags.
This parameter also controls the new process's priority class, which is used to determine the scheduling priorities of the process's threads. For a list of values, see GetPriorityClass. If none of the priority class flags is specified, the priority class defaults to NORMAL_PRIORITY_CLASS unless the priority class of the creating process is IDLE_PRIORITY_CLASS or BELOW_NORMAL_PRIORITY_CLASS. In this case, the child process receives the default priority class of the calling process. или я напутал с порядком?
|
|
« Последнее редактирование: 14-10-2010 16:26 от Ochkarik »
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
semiono
Интересующийся
Offline
|
|
« Ответ #11 : 15-10-2010 16:46 » |
|
format PE Console вот в чём проблема! Решения пока не вижу.
|
|
|
Записан
|
|
|
|
|