Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Как получить Handle или ID процесса


Автор: Madest 28.10.2004, 16:55
Копался на форуме долго, но этого не нашел.

Автор: Mad 28.10.2004, 17:07
Madest
Посмотри в MSDN описание CreateToolhelp32Snapshot

Автор: Step 28.10.2004, 17:11
http://forum.vingrad.ru/index.php?showtopic=31371

Автор: Mad 28.10.2004, 17:14
Step
Не совсем так.
Там обсуждается получение ID по HANDLE, а человека интересует по имени процесса :)

Автор: Step 28.10.2004, 17:21
Mad, к сожелению почемуто получаеться что наши посты ведут себя как конфликтующее и вот эти в том числе

ты сам что предложил вот это CreateToolhelp32Snapshot

ну будет у тебя снимок.... и потом ты будешь искать по имени в этом снимке

а в той теме уже есть код обработки снимка, осталось его только скорректировать...
Добавлено @ 17:25
Код
HANDLE hSnapshot = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 );
 PROCESSENTRY32 pe32.dwSize = sizeof( pe32 );
 if Process32First( hSnapshot, &pe32 )
 {
    do
    {
     //тут надо сравнить поле szExeFile структуры PROCESSENTRY32 с интересующим вас именем и в случае совподения запомнить pe32.th32ProcessID таким образом вы получети ПИД
     } while( Process32Next( hSnapshot, pe32 ) );
 }
 CloseHandle( hSnapshot );

Автор: Goldberg 28.10.2004, 17:25
Посмотри - Process::GetProcessesByName


Автор: Step 28.10.2004, 17:32
Madest, интересная задача..

давайте разберемся

Цитата
по имени в TaskManager


по имени приложения или процесса...

все предложенные варианты были про имя процесса
если необходимо по имени приложения то необходимо получать хендл окна этого приложения и танцевать от него

Автор: Madest 29.10.2004, 09:01
http://forum.vingrad.ru/index.php?showtopic=22801&hl=mysql
Код
//AfxMessageBox("Таинственный MessageBox");
CWnd hwnd;
do
{
hwnd.FindWindow(NULL,"Setup complete");
}
while(!hwnd);
while(IsWindow(hwnd));

Задержка - по закрытию окна "Setup complete". Это в API было. Кстати, не всегда срабатывало. А сейчас пишу свой инсталлятор программы с MFC - вообще не работает. Причем если раскомментировать MessageBox все четко срабатывает. Чудеса да и только =) Что он такого делает - мне не въехать. А не работет вот в каком смысле: процесс "setup.exe" запускается, а "_INS5176_._MP" (вот оно имя процесса найденное в таскменеджере) нет. Мне б найти его ID или сразу HANDLE чтоб затормозить.

Процесс "_INS5176_._MP" не запускается при наличии привиденного выше кода про окно. Т.е. хочу получить HANDLE и тормозить через WaitForSingleObject().
Начальство строго запретило наличие таинственных MessageBox-ов в инсталяшке =)

Goldberq, 'Process' : is not a class or namespace name - пишет мне компилятор.

Автор: Step 29.10.2004, 11:50
по привиденному мной коду вы можете перебрать все процессы, и сравнить имена, получив пид процесса вы открываете его пид-у и получаете хендл.... и делайте то что сможете

Автор: Madest 29.10.2004, 13:38
Осталось немного =)
Код
if(Process32First(hSnapshot,&pe32))
{
do
{
if(pe32.th32ParentProcessID==pi.dwProcessId)
{
AfxMessageBox("aga");
HANDLE hp=OpenProcess(PROCESS_ALL_ACCESS,FALSE,pe32.th32ProcessID);
if(!hp) AfxMessageBox("no handle");
WaitForSingleObject(hp,INFINITE);
}
}
while(Process32Next(hSnapshot,&pe32));
}
CloseHandle(hSnapshot);

По имени отловить не получилось, поймал по родительскому pi.dwProcessId("setup.exe") целых два. Там еще _isdel.exe появляется. Но мимо задержки проскакивает из-за того что хендл как-то неправильно получаю. Чего не так?

Автор: Madest 29.10.2004, 13:58
Хендл на второй процесс получаю, т.е. он не равен NULL, но с ним WAitForSingleObject не ждет. :stena :stena :stena
Кстати, pe32.szExeFile какие-то странные: у первого [System Process], у второго System.

Автор: Step 29.10.2004, 14:11
WAitForSingleObject ищи чтото другое, имхо это не подходит к твой задачи...

Автор: Madest 29.10.2004, 14:21
Другое что? Процесс или функцию? Если функцию, то какую приблизительно? =) Горе мне, горе... А может таки можно как-нить заставить работать код с окном "setup complete" без MessageBox?

Автор: Goldberg 29.10.2004, 22:08
Цитата(Madest @ 29.10.2004, 10:01)
Goldberq, 'Process' : is not a class or namespace name - пишет мне компилятор.

#using <mscorlib.dll>
#using <System.dll>

Добавлено @ 22:13
Код

#using <mscorlib.dll>
#using <System.dll>

using namespace System;
using namespace System::Diagnostics;
using namespace System::ComponentModel;

int main() {
   // Get the current process.
   Process* currentProcess = Process::GetCurrentProcess();

   // Get all instances of Notepad running on the local
   // computer.
   Process* localByName[] = Process::GetProcessesByName(S"notepad");

   // Get all instances of Notepad running on the specific
   // computer.
   // 1. Using the computer alias (do not precede with "\\").
   Process* remoteByName[] = Process::GetProcessesByName(S"notepad", S"myComputer");

   // 2. Using an IP address to specify the machineName parameter.
   Process* ipByName[] = Process::GetProcessesByName(S"notepad", S"169.0.0.0");

   // Get all processes running on the local computer.
   Process* localAll[] = Process::GetProcesses();

   // Get all processes running on the remote computer.
   Process* remoteAll[] = Process::GetProcesses(S"myComputer");

   // Get a process on the local computer, using the process id.
   Process* localById = Process::GetProcessById(1234);

   // Get a process on a remote computer, using the process id.
   Process* remoteById = Process::GetProcessById(2345, S"myComputer");
}


Автор: Madest 2.11.2004, 12:47
Goldberq, что-то не подрубается ничего =(

if(pe32.th32ParentProcessID==pi.dwProcessId) - давало не то что мне нужно.
Ну а вот что я сделал:
Код
if(Process32First(hSnapshot,&pe32))
{
do
{
MessageBox(NULL,pe32.szExeFile,"",MB_OK);//здесь он перечисляет мне все процессы,
//включая и злополучный _INS5176._MP
if(pe32.szExeFile=="_INS5176._MP")
{
AfxMessageBox("aga");
HANDLE hp=OpenProcess(PROCESS_ALL_ACCESS,FALSE,pe32.th32ProcessID);
if(!hp) AfxMessageBox("no handle");
WaitForSingleObject(hp,INFINITE);
}
}
while(Process32Next(hSnapshot,&pe32));
}
CloseHandle(hSnapshot);

Но вот следующее условие if(pe32.szExeFile=="_INS5176._MP") не срабатывает, хотя передо мной код и MessageBox с "_INS5176._MP - они совпадают по названию! Попробовал банально if(pe32.szExeFile=="MSDEV.EXE") - тоже ничего! Как сравнивать имя процесса в таскменеджере и pe32.szExeFile. Скоро сойду с ума.
:stena :stena :stena :stena :stena :stena :stena :stena :stena :stena :stena :stena :stena

Автор: Step 2.11.2004, 13:04
сравнивай не строчки а области памяти

memcmp, или чето такое

szExeFile - это не строка, а указатель на страку


типа

char a[]="_INS5176._MP";
memcmp((void*)a,(void*)pe32.szExeFile,12);
Код

char a[]="_INS5176._MP";
memcmp((void*)a,(void*)pe32.szExeFile,12);

Автор: Madest 2.11.2004, 13:19
Действительно указатель =) Совсем я тавой-то.
Правда не умею сравнивать указатель строку =(
Но это уже проще.

Автор: Madest 2.11.2004, 14:16
Код
if(Process32First(hSnapshot,&pe32))
{
do
{
if (!strcmp(pe32.szExeFile,"_INS5176._MP"))
{
AfxMessageBox("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAa");
HANDLE hp=OpenProcess(PROCESS_QUERY_INFORMATION,FALSE,pe32.th32ProcessID);
CString s;
s.Format("id=%i",pe32.th32ProcessID);
AfxMessageBox(s);
WaitForSingleObject(hp,INFINITE);
}
}
while(Process32Next(hSnapshot,&pe32));
}
CloseHandle(hSnapshot);
AfxMessageBox("posle");

WaitForSingleObject не работает =( Но уже по нужному процессу пытаюсь затормозить.

Автор: Step 2.11.2004, 14:25
WaitForSingleObject - тормозит твой процесс но ни как не другой....
а первый параметр это чучуть не тот хендл о котором ты думаешь.... это переменная по которой стработает


поковыряйтесь вот в этом DebugActiveProcess может найдете чтото

Автор: Madest 2.11.2004, 14:49
Может мы не поняли друг друга? Мне и нужно мою программу затормозить, пока не отработает до конца setup.exe MYSQL.
Кстати, поменяв в OpenProceess() PROCESS_QUERY_INFORMATION на PROCESS_ALL_ACCESS моя программа останавливается, но не продолжает работать по завершению ожидаемого процесса. Вот.

Автор: Step 2.11.2004, 16:14
Madest, внатури не поняли.. тебе прямяком в факю надо, там помоему подобное было...

Автор: Атос 6.11.2004, 10:26
упс....

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)