Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.51 MB
Время: 0.083 c
1-89910
hellmachine
2003-11-15 04:23
2003.11.27
Возможно ли программно определить - был ли перекрыт виртуальный


11-89799
Kobik
2003-03-20 20:32
2003.11.27
KOL+DirectX


1-89891
Sacred
2003-11-14 22:42
2003.11.27
TreeView + CheckBox!!!?!?!?!?!


14-90130
Igor_thief
2003-10-31 18:00
2003.11.27
DLL


1-89849
Cash
2003-11-16 17:12
2003.11.27
Как работать с RGB