Текущий архив: 2003.11.27;
Скачать: CL | DM;
ВнизЛюди не гневитесь... Найти похожие ветки
← →
Knight (2003-11-02 21:33) [0]Где-то такая тема была и не один раз, но не могу найти... :)
Вобщем, запукаю через ShellExecute прогу... Вопрос: как отслеживать её присутствие и закрыть из своей программы, если есть только её Instance, возвращаемый функцией ShellExecute?
← →
Игорь Шевченко (2003-11-02 21:35) [1]ShellExecuteEx
← →
Knight (2003-11-02 22:11) [2]То ли я в хелпе, что-то не так понял... то ли что-то не допонял, но не получается...
← →
Knight (2003-11-02 23:01) [3]Поясните кто-нибудь, почему...
FillChar(Info, SizeOf(Info), 0);
Info.cbSize := SizeOf(TShellExecuteInfo);
with Info do begin
fMask:=SEE_MASK_CLASSNAME;
Wnd:=Application.Handle;
lpVerb:="open";
lpFile:=PChar(F);
lpParameters:=nil;
lpDirectory:=PChar(D);
nShow:=SW_NORMAL;
end;
// 1) if ShellExecuteEx(@Info) then begin
// 2)
ShellExecuteEx(@Info);
if Info.hInstApp>32 then begin
//
end;
И в варианте 1 и в 2 происходит заход в условие даже если файл не найден... а если найден, то вместо файла F из директории D, запускается вообще левая прога из другой папки никак не связанная с нужной... хотя ShellExecute запускает то что надо... это у меня крыша едет или у Delphi? %)
← →
Knight (2003-11-03 07:57) [4]Удалено модератором
← →
Knight (2003-11-03 08:35) [5]Проблем со строкой
fMask:=SEE_MASK_CLASSNAME;
Если комментирую, то запускается то, что надо... пишу любое значение из приведённых в хелпе и снова запускается левая прога... Объясните кто-нибудь...
← →
Knight (2003-11-03 09:33) [6]Удалено модератором
← →
Knight (2003-11-03 15:14) [7]Если даже мастеров этот вопрос в тупик поставил, то я вообще в дауне... :(
← →
Игорь Шевченко (2003-11-03 15:58) [8]
> FillChar(Info, SizeOf(Info), 0);
> Info.cbSize := SizeOf(TShellExecuteInfo);
> with Info do begin
> fMask:=SEE_MASK_CLASSNAME;
> Wnd:=Application.Handle;
> lpVerb:="open";
> lpFile:=PChar(F);
> lpParameters:=nil;
> lpDirectory:=PChar(D);
> nShow:=SW_NORMAL;
SEE_MASK_CLASSNAME означает использование поля lpClass структуры SHELLEXECUTEINFO, а оно у тебя не указано.
Help когда-нибудь читать будем ? Или только значения WM_NCHITTEST запоминать наизусть ? ;-)
← →
Knight (2003-11-03 16:32) [9]> Или только значения WM_NCHITTEST запоминать наизусть ? ;-)
Сроду такие глупости наизусть не запоминал... зачем запоминать то, что пожно посмотреть, если надо :)
> SEE_MASK_CLASSNAME означает использование поля lpClass
> структуры SHELLEXECUTEINFO, а оно у тебя не указано.
Я это понял так, что если эта маска стоит, то в поле lpClass помещается имя класса, а если не указано, то оно игнорируется... я что не прав?
← →
Игорь Шевченко (2003-11-03 16:46) [10]Knight © (03.11.03 16:32)
Не прав
← →
Knight (2003-11-03 16:49) [11]А причем тут другая прога, которая запускается???
← →
Игорь Шевченко (2003-11-03 16:59) [12]
> А причем тут другая прога, которая запускается???
Wave a dead chicken
← →
Knight (2003-11-03 17:15) [13]Я то обрадовался, думал, это данные запущенной проги, а это оказывается задавать надо перед запуском... и чем тогда ShellExecuteEx лучше чем ShellExecute?
Примера нет?
← →
Knight (2003-11-03 17:22) [14]Может прощё использовать CreateProcess-TerminateProcess?
Хотя ими я тоже раньше не пользовался... надобности не было :)
← →
Игорь Шевченко (2003-11-03 17:30) [15]Knight © (03.11.03 17:15)
> и чем тогда ShellExecuteEx лучше чем ShellExecute?
Тем, что позволяет запускать приложение и ждать его окончания.
> Примера нет?
Примера есть:
procedure TfMain.DumpFile(const FileName : String);
var
ShellInfo : TShellExecuteInfo;
ParamsString : String;
begin
ParamsString := Format("-em %s %s.aaa", [FileName, FileName]);
ShellInfo.cbSize := SizeOf(ShellInfo);
ShellInfo.fMask := SEE_MASK_NOCLOSEPROCESS;
ShellInfo.Wnd := Handle;
ShellInfo.lpVerb := "open";
ShellInfo.lpFile := "tdump";
ShellInfo.lpParameters := PChar(ParamsString);
ShellInfo.lpDirectory := nil;
ShellInfo.nShow := SW_SHOW;
if not ShellExecuteEx(@ShellInfo) then
RaiseLastWin32Error();
if ShellInfo.hProcess <> 0 then
try
WaitForSingleObjectEx(ShellInfo.hProcess, INFINITE, false);
finally
CloseHandle(ShellInfo.hProcess);
end;
end;
> Может прощё использовать CreateProcess-TerminateProcess?
> Хотя ими я тоже раньше не пользовался... надобности не было
> :)
Значит, ждет нас масса вопросов по поводу этих функций :)
← →
Knight (2003-11-03 17:56) [16]Повторю вопрос: как отслеживать её присутствие и ЗАКРЫТЬ из своей программы...?
Про ждать пока её закроют, там ничего нет...
← →
Игорь Шевченко (2003-11-03 18:06) [17]Knight © (03.11.03 17:56)
> как отслеживать её присутствие и ЗАКРЫТЬ из своей программы...?
>
Закрывать программу можно по-разному. Это зависит от программы. Ты даешь слишком мало информации, чтобы дать тебе однозначный ответ. В примере показано, что результатом вызова ShellExecuteEx является доступ к handle порожденного процесса для вызывающей программы.
← →
Knight (2003-11-03 18:36) [18]Как один из вариантов Apache.exe... прога висит в систрее нажимаю правую клавишу, всплывает попменю, выбираю Start Apache, сервер запускается в режиме SW_HIDE, потом выбираю Close Apache, невидимое окно сервера закрывается... всё просто, открыть открывается, но как закрыть? Логически... Если функцией ShellExecute возвращается значение Instance, значит его можно для чего-то использовать, но я не нашёл ни одной функции, которой его можно передать, все требуют HWND... Короче, или я чего-то не нашёл, или окончательно запутался либо и то и другое...
← →
Игорь Шевченко (2003-11-03 20:03) [19]Apache имеет собственную программу управления, которая и реагирует на обработку событий от "иконки в трее". И эта программа умеет общаться с сервером Apache и посылать ему команды запуска и остановки. Но из этого не следует, что таким образом можно обращаться с любой программой :)
← →
Knight (2003-11-03 21:28) [20]Была у меня такая прога, но затёр её ненароком, а снова искать влом... ну да ладно, сделал я свою, всё заработало. Спасибо за помощь :)
Страницы: 1 вся ветка
Текущий архив: 2003.11.27;
Скачать: CL | DM;
Память: 0.49 MB
Время: 0.01 c