Версия для печати темы

Нажмите сюда для просмотра этой темы в оригинальном формате

WinCity.Ru _ Программирование _ Пролема с кодом

Автор: shplint Среда, 15 Октября 2008, 12:12

#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

shplint,
1. Функции EnumProcesses, EnumProcessModules и GetModuleFileNameEx (а не GetModuleFileEx) определены в инклюде psapi.h, который у тебя не подключен.
2. С этим кодом очень возможно получить Access Violation - память под массивы PidProcess, hProc вообще не выделяется.

Автор: shplint Четверг, 16 Октября 2008, 13:48

Я попробовал включить <psapi.h> но у меня компилятор говорит я рне знаю такой директории...
Если я применю функцию GetModuleBaseName(hp,*hProc[i],NameProcess,sizeof(NameProcess)) я смогу узнать название процессов по их pid-ам?

Автор: Квазимодо Четверг, 16 Октября 2008, 14:37

Да, функция вернет названия (без путей). Но она, опять-таки, определена в psapi.h. Обычно этот файл есть в MS Platform SDK, но у тебя, как я понял, его нет, так что текст psapi.h можешь получить хотя бы http://www.programmersheaven.com/download/37002/63/ZipView.aspx и записать его в директорию Include своего компилятора.

Автор: shplint Четверг, 16 Октября 2008, 17:36

Квазимодо пасибо за подсказку! Но в коде врзникли др ошибки, я вроде его поправил, но ничего не помогло. Посмотри пож еще один вариант кода. Обрати внимание на то что я убрал указатели и еще изменения в 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

Ошибки в линковке пошли... Тогда напиши, 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

А вот эти функции правильно написаны?


{ 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);


}

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