Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Как закрыть процесс, созданный ShellExecute()?

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3

Открыть новую тему     Написать ответ в эту тему

mihas83



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Для принудительного и безоговорочного завершения процессов в Win32 служит функция TerminateProcess().
Без проблем она работает в "паре" с CreateProcess()...
Но ей "нужен" HANDLE hProcess - описатель процесса, а ShellExecute() возвращает HINSTANCE...  :-\  
Как корректно (принудительно) в нештатной ситуации закрыть процесс, созданный ShellExecute()?

----------
Мы знаем: время растяжимо. Оно зависит от того,
Какого рода содержимым Вы заполняете его. (C. Маршак)

Всего записей: 7835 | Зарегистр. 15-07-2003 | Отправлено: 09:36 12-11-2003
ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Попробуй это

Цитата:
 
The GetWindowThreadProcessId function retrieves the identifier of the thread that created the specified window and, optionally, the identifier of the process that created the window. This function supersedes the GetWindowTask function.  
 
DWORD GetWindowThreadProcessId(
 
    HWND hWnd, // handle of window
    LPDWORD lpdwProcessId // address of variable for process identifier
   );
 

Потом OpenProcess and then TerminateProcess.
Однако не рекомендуют это. Хотя я сам так всегда поступаю с плхими окнами ))))


----------
И создал Бог женщину... Существо получилось злобное, но забавное...

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 09:39 12-11-2003
mihas83



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ShIvADeSt

Цитата:
Потом OpenProcess and then TerminateProcess... Однако не рекомендуют это.  

Вот именно... Тогда проще поменять этот "кусок" кода на ShellExecuteEx() - возвращает Handle процесса.  
Но не хотят менять этот "кусок" кода ни на ShellExecuteEx(), ни на CreateProcess()...


----------
Мы знаем: время растяжимо. Оно зависит от того,
Какого рода содержимым Вы заполняете его. (C. Маршак)

Всего записей: 7835 | Зарегистр. 15-07-2003 | Отправлено: 10:03 12-11-2003
Sleepwalker



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ShIvADeSt
это был единственный вариант, который оказался возможным в 98-ой винде.. в 2000 достаточно послать было окну WM_CLOSE
В 98-ой пришлось извращаться:
 
            GetWindowThreadProcessID(findwindow(nil,pchar(regwin)),procID);
            ProcH:=OpenProcess(PROCESS_ALL_ACCESS,true,procID);
            terminateprocess(ProcH,0);
 
даже окно дос-сессии умирает без единого писка

----------
...или я ничего не понимаю в этой жизни... или понимаю слишком хорошо...

Всего записей: 1957 | Зарегистр. 19-10-2002 | Отправлено: 10:16 12-11-2003
mihas83



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Sleepwalker
На счет "спарки" ShellExecute() - TerminateProcess()  нет идей?

Всего записей: 7835 | Зарегистр. 15-07-2003 | Отправлено: 10:22 12-11-2003 | Исправлено: mihas83, 10:22 12-11-2003
mihas83



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Написал так:
ShellExecuteEx запускает батник "смежников" - коллег...  
В итоге - в "черном окне" (cmd.exe) выполняется последовательно разные команды и операции (включая Java):
 

Код:
 
    SHELLEXECUTEINFO sei = {0};
 
    sei.cbSize  = sizeof(sei);
    sei.fMask   = SEE_MASK_NOCLOSEPROCESS;
    sei.lpVerb  = "open";
    sei.hwnd    = GetSafeHwnd();
    sei.nShow   = SW_SHOWNORMAL;
    sei.lpFile  = strDiagFullPath;
    sei.lpParameters  = NULL;
    sei.lpDirectory   = NULL;
 
    ShellExecuteEx(&sei):
................................
    if (Status != START_APP)  
    {
        TerminateProcess(sei.hProcess, 1);
        PostMessage(WM_CLOSE);
        return TRUE;    
    }
 

 
Так вот, когда попaдаю в if () ...процесс не убивается ?  
Может потому, что он использует cmd.exe?
В чем причина?

----------
Мы знаем: время растяжимо. Оно зависит от того,
Какого рода содержимым Вы заполняете его. (C. Маршак)

Всего записей: 7835 | Зарегистр. 15-07-2003 | Отправлено: 23:02 12-11-2003 | Исправлено: mihas83, 23:07 12-11-2003
ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
mihas83
Вопрос. А утебя только один такой файл в ShellExecute запускается или их несколько с одинаковыми именами. Если один, то можно перебрать все процессы найти нужный и убить его. Есть исходники С и Дельфи.

Цитата:
Так вот, когда попaдаю в if () ...процесс не убивается ?  

А ты делал так OpenProcess(PROCESS_ALL_ACCESS,true,procID)?
Иначе он у тебя не убьется.

----------
И создал Бог женщину... Существо получилось злобное, но забавное...

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 02:15 13-11-2003
mihas83



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ShIvADeSt

Цитата:
утебя только один такой файл в ShellExecute запускается или их несколько  

...только один такой файл  

Цитата:
А ты делал так OpenProcess(PROCESS_ALL_ACCESS,true,procID)?  
Иначе он у тебя не убьется.
 Почему ты так считаешь?

Всего записей: 7835 | Зарегистр. 15-07-2003 | Отправлено: 07:57 13-11-2003
ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
mihas83

Цитата:
 
The TerminateProcess function terminates the specified process and all of its threads.  
BOOL TerminateProcess(
 
    HANDLE hProcess, // handle to the process  
    UINT uExitCode // exit code for the process  
   );
Parameters
hProcess
Identifies the process to terminate.  
Windows NT: The handle must have PROCESS_TERMINATE access. For more information, see Process Objects.  
 

Исходя из выше сказанного надо делать OpenProcess с необходимыми флагами, иначе не убьешь процесс. Сам несколько раз пробовал - знаю.
Хотя у тебя случай проще.
Раз процесс один то не надо извращений с Java. Пишешь процедуру, которая перебирает в памяти все процессы и убивает нужный по имени. Илит хочешь кину тебе прогу с исходниками которая при запуске н-р killer.exe stupidproc.exe убивает stupidproc нафиг. По моему то, что тебе надо.

----------
И создал Бог женщину... Существо получилось злобное, но забавное...

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 09:49 13-11-2003
Sleepwalker



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
mihas83
хотя бы по этой причине:
Windows NT: The handle must have PROCESS_TERMINATE access.  
почему у тебя не убивается - это ХЗ, у меня убивалось все просто прекрасно...  
"надо смотреть" (с)  


----------
...или я ничего не понимаю в этой жизни... или понимаю слишком хорошо...

Всего записей: 1957 | Зарегистр. 19-10-2002 | Отправлено: 09:55 13-11-2003
mihas83



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Sleepwalker

Цитата:
почему у тебя не убивается - это ХЗ

Сам удивляюсь... "Грешу" на cmd.exe...
ХЗ - ?

Всего записей: 7835 | Зарегистр. 15-07-2003 | Отправлено: 10:05 13-11-2003
Sleepwalker



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
mihas83
хрен знает
насчет смд - это ты зря, консолько в 2к убивается очень легко. Впрочем, как и в 98-ой дос-сессия.

----------
...или я ничего не понимаю в этой жизни... или понимаю слишком хорошо...

Всего записей: 1957 | Зарегистр. 19-10-2002 | Отправлено: 10:45 13-11-2003
mihas83



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Sleepwalker

Цитата:
насчет смд - это ты зря, консолько в 2к убивается очень легко.

Я знаю... Имею в виду, что в нем (в "черном окне") "крутим" (батник "смежников" - коллег)...

----------
Мы знаем: время растяжимо. Оно зависит от того,
Какого рода содержимым Вы заполняете его. (C. Маршак)

Всего записей: 7835 | Зарегистр. 15-07-2003 | Отправлено: 10:57 13-11-2003
Sleepwalker



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
mihas83
ну и чего, что мы там че-то крутим... убили консоль - убилось все, что в ней... у тебя не убивается или зависает?

----------
...или я ничего не понимаю в этой жизни... или понимаю слишком хорошо...

Всего записей: 1957 | Зарегистр. 19-10-2002 | Отправлено: 11:52 13-11-2003
mihas83



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Sleepwalker

Цитата:
у тебя не убивается или зависает?

...не убивается.  

Всего записей: 7835 | Зарегистр. 15-07-2003 | Отправлено: 12:32 13-11-2003
Sleepwalker



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
mihas83
блин, ну тады не знаю... дебагом смотрел, че там с хэндлами происходит? а чего функция возвращает?

----------
...или я ничего не понимаю в этой жизни... или понимаю слишком хорошо...

Всего записей: 1957 | Зарегистр. 19-10-2002 | Отправлено: 14:20 13-11-2003
mihas83



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Sleepwalker

Цитата:
а чего функция возвращает?

...функция ShellExecuteEx() возвращает TRUE, как ей и "положено"...

Всего записей: 7835 | Зарегистр. 15-07-2003 | Отправлено: 17:29 13-11-2003
sawamail



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
mihas83
Может он не успевает завершиться? И его надо подождать. Как пример
 
if(::TerminateProcess(hProcess,uExitCode))
{
DWORD exitCode;
DWORD retValue;

while(1)
{
retValue=GetExitCodeProcess(hProcess,&exitCode);
if(retValue && exitCode!=STILL_ACTIVE) break;
Sleep(100);
}
}

Всего записей: 1467 | Зарегистр. 22-04-2002 | Отправлено: 18:35 13-11-2003
mihas83



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
sawamail

Цитата:
Может он не успевает завершиться? И его надо подождать.  

В том-то и дело, что в некоторых случаях надо "прибить" его до завершения...

----------
Мы знаем: время растяжимо. Оно зависит от того,
Какого рода содержимым Вы заполняете его. (C. Маршак)

Всего записей: 7835 | Зарегистр. 15-07-2003 | Отправлено: 20:11 13-11-2003
sawamail



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
mihas83
В Visual C++ 6.0 был пример TaskList
в нем перед убиванием процесса выполняется ф-я
BOOL EnableDebugPriv(VOID)
{
    HANDLE hToken;
    LUID DebugValue;
    TOKEN_PRIVILEGES tkp;
 
    // Retrieve a handle of the access token
    if(!OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES |  TOKEN_QUERY,&hToken))  
   {
        printf("OpenProcessToken failed with %d\n", GetLastError());
        return FALSE;
    }
 
    // Enable the SE_DEBUG_NAME privilege
    if(!LookupPrivilegeValue((LPSTR)NULL,SE_DEBUG_NAME,&DebugValue))
    {
        printf("LookupPrivilegeValue failed with %d\n", GetLastError());
        return FALSE;
    }
 
    tkp.PrivilegeCount=1;
    tkp.Privileges[0].Luid=DebugValue;
    tkp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;
 
    AdjustTokenPrivileges(hToken,FALSE,&tkp,sizeof(TOKEN_PRIVILEGES),
(PTOKEN_PRIVILEGES)NULL,(PDWORD)NULL);
 
    // The return value of AdjustTokenPrivileges can't be tested
    if(GetLastError()!=ERROR_SUCCESS)
    {
        printf("AdjustTokenPrivileges failed with %d\n",GetLastError());
        return FALSE;
    }
 
    return TRUE;
}
 
а сам процесс убития реализован сл. образом (несколько странноват)
BOOL KillProcess(PTASK_LIST tlist,BOOL fForce)
{
    HANDLE hProcess;
 
    if(fForce || !tlist->hwnd)
    {
        hProcess=OpenProcess(PROCESS_ALL_ACCESS,FALSE,tlist->dwProcessId);
        if(hProcess)  
        {
            hProcess=OpenProcess(PROCESS_ALL_ACCESS,FALSE,tlist->dwProcessId);
            if(hProcess==NULL) return FALSE;
 
            if(!TerminateProcess(hProcess,1))
            {
                CloseHandle(hProcess);
                return FALSE;
            }
 
            CloseHandle(hProcess);
            return TRUE;
        }
    }
 
    // kill the process
    PostMessage(tlist->hwnd,WM_CLOSE,0,0);
 
    return TRUE;
}
 
если хочешь могу выслать весь пример

Всего записей: 1467 | Зарегистр. 22-04-2002 | Отправлено: 11:58 14-11-2003 | Исправлено: sawamail, 12:00 14-11-2003
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2 3

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Как закрыть процесс, созданный ShellExecute()?


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru