Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 2003.11.27;
Скачать: [xml.tar.bz2];

Вниз

Люди не гневитесь...   Найти похожие ветки 

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.017 c
4-90178
Kair
2003-10-01 11:18
2003.11.27
ReadDirectoryChangesW


14-90075
vuk
2003-11-04 17:41
2003.11.27
По аське пришло. :o)


1-89886
igit
2003-11-15 15:04
2003.11.27
спрятать курсор мыши?


1-89906
Frol
2003-11-12 01:10
2003.11.27
Вычисление определенного интеграла


3-89781
jazz
2003-11-06 17:47
2003.11.27
SQL Server Developer version





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский