STARTUPINFO si;
si.cb=sizeof(si);
si.lpReserved=NULL;
si.lpDesktop=NULL;
si.lpTitle=NULL;
si.dwFlags=STARTF_FORCEONFEEDBACK;
si.cbReserved2=0;
si.lpReserved2=NULL;
PROCESS_INFORMATION pi;
if (CreateProcess(StartName.c_str(),NULL,NULL,NULL,false,NULL,NULL,"C:\\Debug\\",&si,&pi)==true)
{
gettime(&t);
MainForm->TextInf->Items->Add(Time+"Óñïåøíûé çàïóñê");
SendMessage(MainForm->TextInf->Handle, WM_VSCROLL, MAKEWORD(SB_BOTTOM, 0), 0);
MainForm->TextInf->Refresh();
}
else
{
gettime(&t);
MainForm->TextInf->Items->Add(Time+"Íå óñïåøíûé çàïóñê");
SendMessage(MainForm->TextInf->Handle, WM_VSCROLL, MAKEWORD(SB_BOTTOM, 0), 0);
MainForm->TextInf->Refresh();
}
Закрыть другое приложение
ShellExecute((void *)Handle,"open","1",NULL,NULL,SW_RESTORE);
Как из своего приложения закрыть полность теперь 1.exe?
СloseWindow просто сварачивает 1.ехе в панель задач.
Спасибо.
Цитата:
Originally posted by Inga
Из своего приложения запустила свою программу 1.exe
ShellExecute((void *)Handle,"open","1",NULL,NULL,SW_RESTORE);
Как из своего приложения закрыть полность теперь 1.exe?
СloseWindow просто сварачивает 1.ехе в панель задач.
Спасибо.
Из своего приложения запустила свою программу 1.exe
ShellExecute((void *)Handle,"open","1",NULL,NULL,SW_RESTORE);
Как из своего приложения закрыть полность теперь 1.exe?
СloseWindow просто сварачивает 1.ехе в панель задач.
Спасибо.
А если послать главному окну "одного exe" сообщение WM_QUIT?
Ещё есть BOOL TerminateProcess(HANDLE hProcess, UINT uExitCode); . Только, имхо, лучше использовать ShellExecuteEx() или CreateProcess(), чтобы проще было Handle процесса получать.
Если я запустил приложение с помощью Createprocess вот пример:
Код:
Как опираясь на этот код можно проверить запущено ли мое приложение?
И как можно это приложение завершить?
И как можно это приложение завершить?[/QUOTE]
Спросить у запущенного процесса, вызвав:
Код:
BOOL GetExitCodeProcess(
HANDLE hProcess,
LPDWORD lpExitCode
);
HANDLE hProcess,
LPDWORD lpExitCode
);
если STILL_ACTIVE то он еще дышит...
P.S. hProcess берешь из pi.
TerminateProcess убивает процесс. Ждет завершения всех операций I/O и убивает.
Спасибо всем!
Допустим я знаю что на моем компе запущена программа (а точнее несколько ее копий, для примера пусь будет 5 копий).
Я знаю точно путь, где находится данная программа (пусть для примера c:\\files\\app.exe).
Приложения запускаются как невидимые (просто скрытые, в диспетчере задач отобразится 5 процессов app.exe).
Так вот стоит задача в том чтобы определить запущена ли данная программа? Если запущена то одна или есть еще несколько копий? Если запущено несколько копий то сколько их? И самое главное как их можно уничтожить? Я же не знаю в данном случае handle ни первого ни пятого.
Кто может подскажите пожалуйста! Заранее спасибо!
В общем случае - перечислить все процессы в системе, сравнивая их имена с c:\\files\\app.exe. Во время перечисления узнаеш и их хэндлы, и количество посчитаеш.
Ну на словах-то все просто, а примерчик можно? Я ради этого вопрос и задал.
Код:
PROCESSENTRY32 pe32 = { sizeof(PROCESSENTRY32) };
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (Process32First(hSnapshot, &pe32))
{
do
{
// Здесь получаеш нужную информацию о процессе
// Хэндл процесса:
// HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pe32.th32ProcessID);
// Путь к файлу:
// GetModuleFileNameEx(hProcess, NULL, szBuffer, sizeof(szBuffer) / sizeof(TCHAR));
}
while (Process32Next(hSnapshot, &pe32));
}
CloseHandle(hSnapshot);
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (Process32First(hSnapshot, &pe32))
{
do
{
// Здесь получаеш нужную информацию о процессе
// Хэндл процесса:
// HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pe32.th32ProcessID);
// Путь к файлу:
// GetModuleFileNameEx(hProcess, NULL, szBuffer, sizeof(szBuffer) / sizeof(TCHAR));
}
while (Process32Next(hSnapshot, &pe32));
}
CloseHandle(hSnapshot);
Для правильной работы программа должна иметь привилегии отладчика.
Спасибо, опробую чуть позже...