|
|
|
|
shplint |
Среда, 15 Октября 2008, 12:12
|
Участник
Профиль
Группа: Участник
Сообщений: 156
Регистрация: 22.10.2005
Из: Россия, Семенов
Пользователь №: 9791
Конфигурация
Корпус: -- Процессор: Athlon 64 (socket 754/939/AM2) Материнская плата: Epox 9npa+ Оперативная память: SUMSUNG 256Мб,+384мб Видеокарта: Ati radeon x700 Жесткий диск (винчестер): Seagate Barracuda IV 340016A Дисковод: Нет дисковода CD/DVD: TEAC DW-552G, LG-GCR8500B Модем: smart ax mt880 Сетевой адаптер: -- Звуковая плата: -- Монитор: SUMSUNG SM 753DFX Операционная система: Windows XP Прочее: --

|
#include "stdafx.h" #include <stdio.h> #include <conio.h> #include <windows.h>
#define MAX_PATH 1024
bool KillProcByPid(DWORD pid); bool ListProcess(void); void PrintProcess(DWORD pid);
int main(int argc, char* argv[]) { DWORD pid; ListProcess(); PrintProcess(pid); KillProcByPid(pid);
(void)getch(); return 0; }
bool KillProcByPid(DWORD pid) { DWORD ExitCode;//Êîä çàâåðøåíèÿ ïðîöåññà HANDLE hp;// óêàçàòåëü íà pid ïðîöåññà bool ret = true;
puts("\t\nenter pid->"); scanf("%ld",&pid); if(pid!=NULL)//Ïðîâåðÿåì íå 0 ëè íîìåð ïðîöåññà åñëè äà òî ->... åñëè íåò -> return { hp = OpenProcess(PROCESS_ALL_ACCESS, true, pid);//hp=&pid if (hp!=NULL) { GetExitCodeProcess(hp, &ExitCode);//ïðîâåðÿåì çàâåðøèëñÿ ëè ïðîöåññ ñàì ïî ñåáå ret=TerminateProcess(hp, ExitCode);//çàâåðøàåì ïðîöåññ ïðèíóäèòåëüíî } else { return false; } } else { return false; }
CloseHandle(hp); return ret; }
bool ListProcess(void) { DWORD *PidProcess[1024],i,*cbNeeded,cb; DWORD CountProcess;
EnumProcesses(&PidProcess[0],sizeof(PidProcess),&cbNeeded); CountProcess=(*cbNeeded)/sizeof(DWORD);
for(i=0;i<CountProcess;i++) { printf("\n\t\t"); printf("%ld",*PidProcess[i]); }
return true;
}
void PrintProcess(DWORD pid) { HMODULE *hProc[1024]; HANDLE hp; DWORD cbNeeded,i; char NameProcess[MAX_PATH];
hp=OpenProcess(PROCESS_ALL_ACCESS,false,pid);//ñîçäàåì óêàçàòåëü íà ïðîöåññ if (hp!=NULL) { if(EnumProcessModules(hp,hProc,sizeof(hProc),&cbNeeded)!=NULL) { for(i=0;i<cbNeeded/sizeof(HMODULE);i++) { if(GetModuleFileEx(hp,*hProc[i],NameProcess,sizeof(NameProcess)))//ïîëó÷àåì ïóòü ïðîöåññà printf("\t%s (0x%08X)\n",NameProcess,*hProc[i]);//âûâîäèì èìÿ ïðîöåññà è åãî äåñêðèïòîð äëÿ ÎÑ } } }
CloseHandle(hp); } Суть проблемы вот в чем. Компилятор ругается в вункциях ListProcess и PrintProcess говорит что не знает ф. EnumProcess... хотя хедер я подключил. Помогите пожалуста!
|
|
|
|
|
Квазимодо |
Четверг, 16 Октября 2008, 9:17
|
Участник
Профиль
Группа: Участник
Сообщений: 162
Регистрация: 25.11.2003
Пользователь №: 6223
Конфигурация
Корпус: -- Материнская плата: -- Оперативная память: -- Видеокарта: -- Жесткий диск (винчестер): -- Дисковод: Нет дисковода CD/DVD: -- Модем: -- Сетевой адаптер: -- Звуковая плата: -- Монитор: -- Операционная система: -- Прочее: --

|
shplint, 1. Функции EnumProcesses, EnumProcessModules и GetModuleFileNameEx (а не GetModuleFileEx) определены в инклюде psapi.h, который у тебя не подключен. 2. С этим кодом очень возможно получить Access Violation - память под массивы PidProcess, hProc вообще не выделяется.
--------------------
Я долго учился на чужих ошибках, и теперь мои собственные ошибки не хуже, чем у других.
|
|
|
|
|
shplint |
Четверг, 16 Октября 2008, 13:48
|
Участник
Профиль
Группа: Участник
Сообщений: 156
Регистрация: 22.10.2005
Из: Россия, Семенов
Пользователь №: 9791
Конфигурация
Корпус: -- Процессор: Athlon 64 (socket 754/939/AM2) Материнская плата: Epox 9npa+ Оперативная память: SUMSUNG 256Мб,+384мб Видеокарта: Ati radeon x700 Жесткий диск (винчестер): Seagate Barracuda IV 340016A Дисковод: Нет дисковода CD/DVD: TEAC DW-552G, LG-GCR8500B Модем: smart ax mt880 Сетевой адаптер: -- Звуковая плата: -- Монитор: SUMSUNG SM 753DFX Операционная система: Windows XP Прочее: --

|
Я попробовал включить <psapi.h> но у меня компилятор говорит я рне знаю такой директории... Если я применю функцию GetModuleBaseName(hp,*hProc[i],NameProcess,sizeof(NameProcess)) я смогу узнать название процессов по их pid-ам?
|
|
|
|
|
Квазимодо |
Четверг, 16 Октября 2008, 14:37
|
Участник
Профиль
Группа: Участник
Сообщений: 162
Регистрация: 25.11.2003
Пользователь №: 6223
Конфигурация
Корпус: -- Материнская плата: -- Оперативная память: -- Видеокарта: -- Жесткий диск (винчестер): -- Дисковод: Нет дисковода CD/DVD: -- Модем: -- Сетевой адаптер: -- Звуковая плата: -- Монитор: -- Операционная система: -- Прочее: --

|
Да, функция вернет названия (без путей). Но она, опять-таки, определена в psapi.h. Обычно этот файл есть в MS Platform SDK, но у тебя, как я понял, его нет, так что текст psapi.h можешь получить хотя бы здесь и записать его в директорию Include своего компилятора.
--------------------
Я долго учился на чужих ошибках, и теперь мои собственные ошибки не хуже, чем у других.
|
|
|
|
|
shplint |
Четверг, 16 Октября 2008, 17:36
|
Участник
Профиль
Группа: Участник
Сообщений: 156
Регистрация: 22.10.2005
Из: Россия, Семенов
Пользователь №: 9791
Конфигурация
Корпус: -- Процессор: Athlon 64 (socket 754/939/AM2) Материнская плата: Epox 9npa+ Оперативная память: SUMSUNG 256Мб,+384мб Видеокарта: Ati radeon x700 Жесткий диск (винчестер): Seagate Barracuda IV 340016A Дисковод: Нет дисковода CD/DVD: TEAC DW-552G, LG-GCR8500B Модем: smart ax mt880 Сетевой адаптер: -- Звуковая плата: -- Монитор: SUMSUNG SM 753DFX Операционная система: Windows XP Прочее: --

|
Квазимодо пасибо за подсказку! Но в коде врзникли др ошибки, я вроде его поправил, но ничего не помогло. Посмотри пож еще один вариант кода. Обрати внимание на то что я убрал указатели и еще изменения в main,ListProcess,PrintProcess ну думаю ты сам знаешь что не так ВОТ СПИСОК ОШИБОК Linking... handleprocess.obj : error LNK2001: unresolved external symbol _EnumProcesses@12 handleprocess.obj : error LNK2001: unresolved external symbol _GetModuleBaseNameA@16 handleprocess.obj : error LNK2001: unresolved external symbol _EnumProcessModules@16 Debug/handleprocess.exe : fatal error LNK1120: 3 unresolved externals Error executing link.exe.
handleprocess.exe - 4 error(s), 0 warning(s)
#include "stdafx.h" #include <stdio.h> #include <conio.h> #include <windows.h> #include "psapi.h"
#define MAX_PATH 1024
bool KillProcByPid(DWORD pid); bool ListProcess(void); void PrintProcess(DWORD *ptrPidProcess,DWORD CountProcess);
int main(int argc, char* argv[]) { DWORD pid; DWORD *ptrPidProcess,CountProcess; ListProcess(); PrintProcess(ptrPidProcess,CountProcess); KillProcByPid(pid);
(void)getch(); return 0; }
bool KillProcByPid(DWORD pid) { DWORD ExitCode;//Êîä çàâåðøåíèÿ ïðîöåññà HANDLE hp;// óêàçàòåëü íà pid ïðîöåññà bool ret = true;
puts("\t\nenter pid->"); scanf("%ld",&pid); if(pid!=NULL)//Ïðîâåðÿåì íå 0 ëè íîìåð ïðîöåññà åñëè äà òî ->... åñëè íåò -> return { hp = OpenProcess(PROCESS_ALL_ACCESS, true, pid);//hp=&pid if (hp!=NULL) { GetExitCodeProcess(hp, &ExitCode);//ïðîâåðÿåì çàâåðøèëñÿ ëè ïðîöåññ ñàì ïî ñåáå ret=TerminateProcess(hp, ExitCode);//çàâåðøàåì ïðîöåññ ïðèíóäèòåëüíî } else { return false; } } else { return false; }
CloseHandle(hp); return ret; }
bool ListProcess(void) { DWORD PidProcess[1024],i,cbNeeded,cb; DWORD CountProcess, *ptrPidProcess;
EnumProcesses(PidProcess,sizeof(PidProcess),&cbNeeded); CountProcess=cbNeeded/sizeof(DWORD);
for(i=0;i<CountProcess;i++) { printf("\n\t\t"); printf("%ld",PidProcess[i]); } ptrPidProcess=&PidProcess[0];
return true;
}
void PrintProcess(DWORD *ptrPidProcess,DWORD CountProcess) { HMODULE hProc[1024]; HANDLE hp; DWORD cbNeeded,i,Pid; char NameProcess[MAX_PATH];
for(i=0;i<CountProcess;i++) { hp=OpenProcess(PROCESS_ALL_ACCESS,false,*ptrPidProcess);//ñîçäàåì óêàçàòåëü íà ïðîöåññ ptrPidProcess++; } if (hp!=NULL) { if(EnumProcessModules(hp,hProc,sizeof(hProc),&cbNeeded)!=NULL) { for(i=0;i<cbNeeded/sizeof(HMODULE);i++) { if(GetModuleBaseName(hp,hProc[i],NameProcess,sizeof(NameProcess)))//ïîëó÷àåì èìÿ ïðîöåññà printf("\t%s (0x%08X)\n",NameProcess,hProc[i]);//âûâîäèì èìÿ ïðîöåññà è åãî äåñêðèïòîð äëÿ ÎÑ } } }
CloseHandle(hp);
}
|
|
|
|
|
Квазимодо |
Пятница, 17 Октября 2008, 8:49
|
Участник
Профиль
Группа: Участник
Сообщений: 162
Регистрация: 25.11.2003
Пользователь №: 6223
Конфигурация
Корпус: -- Материнская плата: -- Оперативная память: -- Видеокарта: -- Жесткий диск (винчестер): -- Дисковод: Нет дисковода CD/DVD: -- Модем: -- Сетевой адаптер: -- Звуковая плата: -- Монитор: -- Операционная система: -- Прочее: --

|
Ошибки в линковке пошли... Тогда напиши, pls, на какой ящик тебе прислать версии файлов psapi.h и psapi.lib из Platform SDK для Windows 2003 (.h запишешь в Include, а .lib - в Lib). Насколько я понимаю, у тебя Visual C++. Значит, придется зайти в меню Project -> Settings -> Link - там в Project Options указаны подключенные библиотеки (*.lib). Добавишь в этот список еще и psapi.lib.
--------------------
Я долго учился на чужих ошибках, и теперь мои собственные ошибки не хуже, чем у других.
|
|
|
|
|
shplint |
Пятница, 17 Октября 2008, 17:03
|
Участник
Профиль
Группа: Участник
Сообщений: 156
Регистрация: 22.10.2005
Из: Россия, Семенов
Пользователь №: 9791
Конфигурация
Корпус: -- Процессор: Athlon 64 (socket 754/939/AM2) Материнская плата: Epox 9npa+ Оперативная память: SUMSUNG 256Мб,+384мб Видеокарта: Ati radeon x700 Жесткий диск (винчестер): Seagate Barracuda IV 340016A Дисковод: Нет дисковода CD/DVD: TEAC DW-552G, LG-GCR8500B Модем: smart ax mt880 Сетевой адаптер: -- Звуковая плата: -- Монитор: SUMSUNG SM 753DFX Операционная система: Windows XP Прочее: --

|
А вот эти функции правильно написаны?
{ DWORD PidProcess[1024],i,cbNeeded,cb; DWORD CountProcess, *ptrPidProcess,*ptrcbNeeeded;
ptrcbNeeded=&cbNeeded; ptrPidProcess=PidProcess;
EnumProcesses(*ptrPidProcess,sizeof(PidProcess),*ptrcbNeeded); CountProcess=cbNeeded/sizeof(DWORD);
for(i=0;i<CountProcess;i++) { printf("ntt"); printf("%ld",PidProcess[i]); } ptrPidProcess=&PidProcess[0];
return true;
}
void PrintProcess(DWORD *ptrPidProcess,DWORD CountProcess) { HMODULE hProc[1024]; HANDLE hp; DWORD cbNeeded,i,Pid; char NameProcess[MAX_PATH]; Чтоыб получить названия всех процессов мне ведь нужен здесь цикл, это правильно? for(i=0;i<CountProcess;i++) { hp=OpenProcess(PROCESS_ALL_ACCESS,false,*ptrPidProcess);//ñîçäàåì óêàçàòåëü íà ïðîöåññ if (hp!=NULL) { if(EnumProcessModules(hp,hProc,sizeof(hProc),&cbNeeded)!=NULL) { for(i=0;i<cbNeeded/sizeof(HMODULE);i++) { if(GetModuleBaseName(hp,hProc[i],NameProcess,sizeof(NameProcess)))//ïîëó÷àåì èìÿ ïðîöåññà printf("t%s (0x%08X)n",NameProcess,hProc[i]);//âûâîäèì èìÿ ïðîöåññà è åãî äåñêðèïòîð äëÿ ÎÑ } } } ptrPidProcess++: }
CloseHandle(hp);
}
Сообщение отредактировал shplint - Пятница, 17 Октября 2008, 17:14
|
|
|
|
|
|
1 чел. читают эту тему (1 Гостей и 0 Скрытых Пользователей)
|
0 Пользователей:
|
|
© Copyright by WinCity.Ru 2001 - 2008 | Обратная связьУслуги веб-хостинга предоставлены компанией MTW.RU
|
|