Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Оболочка для запуска приложения.  (Прочитано 18423 раз)
0 Пользователей и 7 Гостей смотрят эту тему.
semiono
Интересующийся

ru
Offline 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() ?

в общем помогите.

Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline 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
Молодой специалист

ru
Offline 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 » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #3 : 03-10-2010 12:16 » 

resource, в каком смысле забыл ? В МСДН велят вызвать )
http://msdn.microsoft.com/en-us/library/bb762154(VS.85).aspx
Записан

resource
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #4 : 03-10-2010 14:47 » 

Если вкраце, они там пишут, что если нужен COM (не совсем так конечно), то надо его инициализировать, а иначе не надо. И якобы это хорошая практика, всегда так делать.
в общем не стоит принимать близко к сердцу. Да и код у них там приведен монстроузный, однако заметь, сами-то они не вызывают CoInitializeEx (хитрые).
В локальной версии, про это вообще ничего нет. И про ОСи на которых реализована эта функция, тоже приврали. Написано, что XP нужен, а в локальной МСДН написано Windows NT 4.0, Windows 95 (и это больше похоже на правду).
Записан
semiono
Интересующийся

ru
Offline Offline

« Ответ #5 : 03-10-2010 17:48 » new

Спасибо попытаюсь понять. Только я C++ читаю с огромным непониманием. Улыбаюсь
Цитата
ЗЫ топик только получился не про асм
Угу. Ну зато хоть что-то.
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #6 : 03-10-2010 18:52 » 

semiono, C/C++ читать и понимать намного легче, чем ассемблер, но логика от этого не страдает. Эти языки легко переводятся в ассемблер - достаточно попросить компилятор сделать это.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
semiono
Интересующийся

ru
Offline 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
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #8 : 12-10-2010 21:44 » 

bInheritHandles и dwCreationFlags 
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
semiono
Интересующийся

ru
Offline Offline

« Ответ #9 : 14-10-2010 13:51 » 

bInheritHandles имеет два значения TRUE/FALSE, это даже фасм понимает,
dwCreationFlags не все флаги описаны в фасм, поэтому я двордами прошёлся 0x01000000, 0x04000000, 0x00000010,
опять же тишина!
Записан
Ochkarik
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #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,sinfopinfo
Цитата
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 уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
semiono
Интересующийся

ru
Offline Offline

« Ответ #11 : 15-10-2010 16:46 » 

format PE Console
вот в чём проблема!
Решения пока не вижу.
Жаль
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines