Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Дискриптор процесса, как определить? 
:(
    Опции темы
Inga
Дата 20.2.2006, 19:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 18.11.2005

Репутация: нет
Всего: нет



Запускаю функцией свою программу 1.exe:
ShellExecute((void *)Handle,"open","1",NULL,NULL,SW_RESTORE);
Как ее теперь закрыть? Код ниже не правильный:
Код

void __fastcall TMyForm::Button1Click(TObject *Sender)
{
//класс закрываемой формы TMyForm, в заголовке MyForm
TerminateProcess((FindWindow("TMyForm","MyForm")),0);
}

FindWindow возвращает дискриптор окна, а как найти дискриптор процесса, чтобы передать его в TerminateProcess?
Спасибо.

P.S.
и так не работает:
HINSTANCE ProcessID = ShellExecute((void *)Handle,"open","1",NULL,NULL,SW_RESTORE);
затем
TerminateProcess(ProcessID,0); smile

Это сообщение отредактировал(а) Inga - 20.2.2006, 19:23
PM   Вверх
_hunter
Дата 20.2.2006, 19:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 24
Всего: 98



а не проще ли использовать CreateProcess() -- сразу получим хендл и id процесса?


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Ignat
Дата 20.2.2006, 19:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Флудератор
****


Профиль
Группа: Экс. модератор
Сообщений: 4030
Регистрация: 19.4.2004
Где: غيليندزيك مدينة

Репутация: нет
Всего: 73



Насколько понимаю, приложение win32?
Ф-ция ShellExecute сохранилась преимущественно для совместимости с 16битными приложениями.
Для данной задачи выгоднее использовать BOOL ShellExecuteEx( LPSHELLEXECUTEINFO lpExecInfo );
lpExecInfo - структура, один из членов которой и будет иметь дескриптор процесса.
Добавлено @ 19:28
Цитата(Inga @ 20.2.2006, 19:14 Найти цитируемый пост)
HINSTANCE ProcessID

Это не настоящий HINSTANCE smile, а прикол дяди Билли.
Добавлено @ 19:30
Цитата(msdn)

It is not a true HINSTANCE, however. The only thing that can be done with the returned HINSTANCE is to cast it to an int and compare it with the value 32 or one of the error codes below.



--------------------
Теперь при чем :P
PM   Вверх
Inga
Дата 20.2.2006, 22:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 18.11.2005

Репутация: нет
Всего: нет



Спасибо!
Благодаря подсказке нашла пример. Вроде работает:

Код

SHELLEXECUTEINFO SHExecInfo; 

ZeroMemory(&SHExecInfo, sizeof(SHExecInfo));
SHExecInfo.cbSize = sizeof(SHExecInfo);
SHExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS;
SHExecInfo.nShow = SW_SHOWNORMAL;
SHExecInfo.lpFile = "1.exe";
 
if(! ShellExecuteEx (&SHExecInfo)) {
    // обработка ошибок
}


//---------------------------------------
 

TerminateProcess(SHExecInfo.hProcess,0);


PM   Вверх
Inga
Дата 20.2.2006, 23:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 18.11.2005

Репутация: нет
Всего: нет



Есть дополнительный вопрос:
вот из своей программы запускаю еще одну свою программу 1.exe. Это маленькое окно без заголовка с режимом fsStayOnTop. На этой форме таймеры выводят разную информацию (делают метки видимыми на этой маленькой форме). Все это происходит порядка 15 секунд. Так вот, когда начинается выполняться код этой маленькой формы, то на главной форме пропадает меню (см.рисунок). Все что делает главная форма, это запускает на выполнение 1.ехе и его же закрывает. Когда 1.exe закрывается, то главная программа приходит в норму и меню снова появляется. Как заставить меню главной формы не пропадать пока 1.exe выполняется? Может это как-то связано с потерей фокуса у главной формы, когда 1.exe начинает выполняться?


Присоединённый файл ( Кол-во скачиваний: 15 )
Присоединённый файл  1.gif 6,26 Kb
PM   Вверх
_hunter
Дата 21.2.2006, 11:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 24
Всего: 98



запускай вторую форму в отдельном потоке


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Inga
Дата 21.2.2006, 15:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 18.11.2005

Репутация: нет
Всего: нет



>запускай вторую форму в отдельном потоке

Через Syncronize или CreateThead? smile
PM   Вверх
_hunter
Дата 21.2.2006, 15:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 24
Всего: 98



через CreateThread ( можно и TThread использовать )


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Ignat
Дата 21.2.2006, 15:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Флудератор
****


Профиль
Группа: Экс. модератор
Сообщений: 4030
Регистрация: 19.4.2004
Где: غيليندزيك مدينة

Репутация: нет
Всего: 73



Цитата(Inga @ 21.2.2006, 15:15 Найти цитируемый пост)
CreateThead

Его и использовать, хотя для VCL, наверное лучше воспользоваться Классом TThread;

Сделать класс наследник, в нем перегрузить метод Execute() - внести в него код, запускающий ShellExecute, а далее просто создать метод класса.


--------------------
Теперь при чем :P
PM   Вверх
Inga
Дата 21.2.2006, 23:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 18.11.2005

Репутация: нет
Всего: нет



Нет, запуск в отдельном потоке не помог. smile
Если приложение выполняется из IDE все прекрасно, но если запустить отдельно, снова пропадает ToolBar. Если щелкнуть в стороне от 1.exe мышкой, то дополнительно в заголовке приложения из которого было запущено 1.exe появляется надпись Not responding. Выглядит это не привлекательно. Когда 1.exe закрывается все приходит в норму. Наверное, нет решения этой проблемы.
Мой код:
Код

//глобальная переменная
SHELLEXECUTEINFO SHExecInfo;


В главном приложении, из которого запускаю 1.exe:

void __fastcall TBuild::sButton1Click(TObject *Sender)
{
DWORD ThreadID;
 HANDLE hthread = CreateThread(
 0,
 0,
 ThreadFunc,
 0,
 0,
 &ThreadID);

//далее другой код, который выполняется в главном приложении пока сверху 1.exe



//в конце обработчика
TerminateProcess(SHExecInfo.hProcess,0);
}



//функция потока
DWORD CALLBACK ThreadFunc(void * P)
 {
   ZeroMemory(&SHExecInfo, sizeof(SHExecInfo));
   SHExecInfo.cbSize = sizeof(SHExecInfo);
   SHExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS;
   SHExecInfo.nShow = SW_SHOWNORMAL;
   SHExecInfo.lpFile = "1.exe";

if(! ShellExecuteEx (&SHExecInfo))
 {
    //
 }
   return(0);
 }



PM   Вверх
_hunter
Дата 22.2.2006, 11:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 24
Всего: 98



а откуда этот "//далее другой код, который выполняется в главном приложении пока сверху 1.exe" узнает что "сверху 1.exe"?
и что там за код? ( обращения к ресурсам 1.exe есть? )
он ( код этот ), кстати, тоже в потоке должен быть


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Inga
Дата 22.2.2006, 12:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 18.11.2005

Репутация: нет
Всего: нет



Цитата(_hunter @ 22.2.2006, 11:28)
а откуда этот "//далее другой код, который выполняется в главном приложении пока сверху 1.exe" узнает что "сверху 1.exe"?
и что там за код? ( обращения к ресурсам 1.exe есть? )
он ( код этот ), кстати, тоже в потоке должен быть

Другой код, это код который не связан с запущенным 1.ехе. Главное приложение занимается своими делами, перед этим запустив 1.exe поверх себя.
Код в 1.ехе тоже не связан с приложением, из которого его запустили (просто выводит метки у себя).
Щелчок мыши думаю запретить пока 1.exe запущен, чтобы не появлялась надпись Not Responding в заголовке приложения, из которого запущено 1.ехе, а то, что временно пропадает ToolBar и заголовок окна становиться, синим (слетает скин), что ж, так тому и быть. По окончании работы 1.exe все приходит в норму.
Странно, что если это происходит при запущенном IDE все выглядит как надо. smile


PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.3311 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.