Поиск:

Ответ в темуСоздание новой темы Создание опроса
> TerminateProcess 
:(
    Опции темы
Kirgston
Дата 21.2.2009, 18:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Всем доброго времени суток! Вот тут собственно... возник такой вопросик. FindWindow возвращает Хендл окна. Вписывать в него надо класс окна + как бы оглавление... Ф-ция TerminateProcess "убивает" процесс по его Хендлу.

Но вот собственно:

TerminateProcess(FindWindow("Notepad","Безымянный - Блокнот"),0);

Не работает... в принципе как и любое другое... не важно что но оно почему то не закрывает... почему?
Есть ещё аналоги полного убийства имея хендл окна? В Делфях было всё просто я узнавал Хендл, по Хендлу определял имя ехе, а потом уже его убивал =) эта смесь убивала всё =) не важно что перед ней стояло )))))  а тут что-то не могу найти "аналогов"... Помогите пожалуйста!  smile 
PM MAIL   Вверх
THandle
Дата 21.2.2009, 18:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Хранитель Клуба
Group Icon
Награды: 1



Профиль
Группа: Админ
Сообщений: 3639
Регистрация: 31.7.2007
Где: Moscow, Dubai

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



Kirgston, вообще-то в TerminateProcess передается индентификатор процесса, а не дескриптор окна - это две совсем разные вещи. К тому же я бы не советовал использовать TerminateProcess - корректнее, ИМХО, послать окну сообщение о закрытии(WM_CLOSE).
PM   Вверх
Lazin
Дата 21.2.2009, 18:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



открой MSDN, там английским по белому написано "A handle to the process to be terminated", а FindWindow возвращает хэндл окна, так почему-же это могло работать в Delphi? smile 
на самом деле тебе нужно определить id процесса, потом открыть это процесс, затем, если у тебя есть соответствующие права - убить его
PM MAIL Skype GTalk   Вверх
Kirgston
Дата 21.2.2009, 18:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Ребят... дело не в корректности а в том... короче надо "выбить" программу =) чтобы у неё уж точно не осталось шансов на жизнь =)
В Делфи работало наверно потому что ему надо было Хендл окна... 
Хех... а как узнать ИД? просто... бывают такие интересные программки которые меняют ехе и Title в зависимости от названия ехе файла... вот с такими программками я в делфи научился боротся =) ресурсов много не кушает ... но не нравится то что код в С++ в 2 раза меньше оперативки кушает чем в Делфи =) потому "сие чудо" хочу перенести на С++ =)
PM MAIL   Вверх
THandle
Дата 21.2.2009, 19:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Хранитель Клуба
Group Icon
Награды: 1



Профиль
Группа: Админ
Сообщений: 3639
Регистрация: 31.7.2007
Где: Moscow, Dubai

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



Это продолжение этой темы:
http://forum.vingrad.ru/forum/topic-243314...cess/index.html

А API они и в Африке API.
Код


TerminateProcess(FindWindow('Notepad', 'Безымянный - Блокнот'), 0);


Пашет в Делфи?smile

Тебе все уже Lazin сказал.

Добавлено через 4 минуты и 10 секунд
1. Ищешь окно через FindWindow.
2. Получаешь ID процесса через GetWindowThreadProcessId
3. Открываешь с помощью OpenProcess
4. Убиваешь через TerminateProcess, передавая туда результат из OpenProcess.
Ну и проверка на ошибки должна быть обязательно.
PM   Вверх
Kirgston
Дата 21.2.2009, 19:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Ух! =) ладненько поищем ! =) щас буду разбираться... а вот у меня такой вопросик... а может можно узнать имя запущенного ехе через Хендл окна?
PM MAIL   Вверх
THandle
Дата 21.2.2009, 19:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Хранитель Клуба
Group Icon
Награды: 1



Профиль
Группа: Админ
Сообщений: 3639
Регистрация: 31.7.2007
Где: Moscow, Dubai

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



Цитата(Kirgston @  21.2.2009,  19:32 Найти цитируемый пост)
а может можно узнать имя запущенного ехе через Хендл окна? 


Стоп. А в этой теме:

http://forum.vingrad.ru/forum/topic-243314...cess/index.html

У тебя что? Вроде там это и требовалось и вопрос был решен?


Это сообщение отредактировал(а) THandle - 21.2.2009, 19:56
PM   Вверх
Kirgston
Дата 21.2.2009, 20:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Ееее ну да =) только вы посмотрите что разделы несколько сменились =) то что я сделал на Делфи я хочу перенести на С++ =) в пользу меньшего поедания ресурсов ))))) но у меня не очень то получается...  
PM MAIL   Вверх
Kirgston
Дата 21.2.2009, 20:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Ребята =) давайте подумаем логично ^_^ Делфи (Борланд) и С++ (Борланд) . Разница только в синтаксисе =) Помогите пожалуйста перенести код с Делфи на С++  smile один я уже перенес. Компилируется и работает на ура! =) А вот ещё чуток осталось...

Код

function ExeNameByHandle(aWinHandle: HWND): string;
var pProcID: ^DWORD;
begin
GetMem(pProcID, SizeOf(DWORD));
GetWindowThreadProcessId(aWinHandle, pProcID);
result:=GetExeNameByProcID(pProcID^);
FreeMem(pProcID);
end;


Код

function GetExeNameByProcID(ProcID: DWord): string;
var
ContinueLoop: BOOL;
FSnapshotHandle: THandle;
FProcessEntry32: TProcessEntry32;
begin
FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
FProcessEntry32.dwSize := Sizeof(FProcessEntry32);
ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32);
Result := '';
while (Integer(ContinueLoop) <> 0) and (Result = '') do
       begin
       if FProcessEntry32.th32ProcessID = ProcID then
               Result := FProcessEntry32.szExeFile;
       ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32);
       end;
CloseHandle(FSnapshotHandle);
end;


Ребята не думаю что для знающих людей это не станет проблемой т.к. тут вроде только проблема в синтаксисе... =) просто я только недавно перешел на С++ и всех "извилин" С++ не знаю :( пока что проблема в ссылках и указателях. Помогите пожалуйста с переводом! Заранее большое спасибо!!! smile 
PM MAIL   Вверх
Kirgston
Дата 21.2.2009, 21:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

AnsiString __fastcall TForm1::GetExeNameByProcID(DWORD ProcID)
{
bool ContinueLoop;
HANDLE FSnapshotHandle;
PROCESSENTRY32 FProcessEntry32;
FSnapshotHandle = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
FProcessEntry32.dwSize = sizeof(FProcessEntry32);
ContinueLoop = Process32First(FSnapshotHandle, FProcessEntry32);
return "";
while (Integer(ContinueLoop) != 0) && (return == "") {
       if (FProcessEntry32.th32ProcessID == ProcID) {
               return FProcessEntry32.szExeFile;
       }
       ContinueLoop = Process32Next(FSnapshotHandle, FProcessEntry32);
       }
CloseHandle(FSnapshotHandle);
}


Вот перевел как знал... конечно есть ошибки...
[BCC32 Error] Unit1.cpp(80): E2034 Cannot convert 'tagPROCESSENTRY32' to 'tagPROCESSENTRY32 *'
//
[BCC32 Error] Unit1.cpp(80): E2342 Type mismatch in parameter 'lppe' (wanted 'tagPROCESSENTRY32 *', got 'tagPROCESSENTRY32')
//
[BCC32 Warning] Unit1.cpp(82): W8066 Unreachable code
//
[BCC32 Error] Unit1.cpp(82): E2188 Expression syntax

Ребят помогите пожалуйста  smile 

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


Хранитель Клуба
Group Icon
Награды: 1



Профиль
Группа: Админ
Сообщений: 3639
Регистрация: 31.7.2007
Где: Moscow, Dubai

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



Kirgston, return выходит из функции, вводи новую строковую переменную. Значения надо передавать по ссылке:

Типа:
Код


Process32Next(&FSnapshotHandle, &FProcessEntry32);

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

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

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

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

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


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

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


 




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


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

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