用VC++编写程序,像任务管理器那样获得某个进程的句柄数,和线程数

用VC++编写程序,像任务管理器那样获得某个进程的句柄数,和线程数,第1张

VC

获取进程线程数

#include

void

EnumProcess(void)

{

HANDLE

hProcessSnap;

HANDLE

hProcess;

PROCESSENTRY32

pe32;

DWORD

dwPriorityClass;

hProcessSnap

=

CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,

0);

if

(hProcessSnap

==

INVALID_HANDLE_VALUE)

{

return;

}

pe32dwSize

=

sizeof(PROCESSENTRY32);

if

(!Process32First(hProcessSnap,

&pe32))

{

CloseHandle(hProcessSnap);

return;

}

do

{

//printf("%s",

pe32szExeFile);

//完整文件名

//printf("%d",

(int)pe32cntThreads);//线程数

}while(Process32Next(hProcessSnap,

&pe32));

CloseHandle(hProcessSnap);

}

如果要获取进程句柄

HANDLE

hProcessHandle;

hProcessHandle

=

OpenProcess(0x1F0FFF,

true,

ProcessID);//ProcessID进程ID

这个在控制台,Win32

SDK

,MFC

都可以用的,只不过

SDK

,MFC

输出就

不用

printf

了,只要把获取的内容赋给变量就行了

TCHAR GetProcessName(DWORD processID )

{

HANDLE hProcess = OpenProcess( PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, processID);

TCHAR procName = new TCHAR[MAX_PATH];

GetModuleFileNameEx(hProcess, NULL, procName, MAX_PATH);

return procName;

}

调用EnumWindows(EnumWindowsProc,0);

自己定义

BOOL CALLBACK EnumWindowsProc(

HWND hwnd, // handle to parent window

LPARAM lParam // application-defined value

){

DWORD PID;

BOOL Result=TRUE;

GetWindowThreadProcessId(hwnd,PID);

if (PID=GetCurrentProcessId())

{

g_hwin = hwnd;//这个g_hwin在你的DLL里定义为一个全局的HWND,也是你想要的句柄

Result = FALSE;

}

return Result;

}

lz可以试试当然如果知道被注入的进程的窗口名称就不用enumwindow了,直接用FindWindow(NULL, _T("XXXXXX"))的返回值得一个hwnd,然后得到进程id,再判断

原型:

int WINAPI icePub_getProcessInfo(char strInfoList ,int maxLen)

输入:maxLen strInfoList最大长度

输出:strInfoList 进程基本信息,name|pid|path,一行一条信息

int recordCounts;

char buff[102430+1];

typedef int (WINAPI ICEPUB_GETPROCESSINFO)(char strInfoList ,int maxLen);

ICEPUB_GETPROCESSINFO icePub_getProcessInfo = 0;

HINSTANCE hDLLDrv = LoadLibrary("icePubDlldll");

if(hDLLDrv)

{

icePub_getProcessInfo = (ICEPUB_GETPROCESSINFO )GetProcAddress(hDLLDrv, "icePub_getProcessInfo");

}

if(icePub_getProcessInfo)

recordCounts=icePub_getProcessInfo(buff,102430);

if(hDLLDrv)

FreeLibrary(hDLLDrv);

AfxMessageBox(buff);

你好,你要用VC打开一个进程的话应该先创建后打开

void

CSwitchDlg::OnSTB1()

{

PROCESS_INFORMATION

pi;

if(OpenSTB(1,&pi)==TRUE)

{

m_ListSetItemText(0,2,_T("关机"));

CString

pid;

pidFormat(_T("%d"),pidwProcessId);

m_ListSetItemText(0,1,pidGetBuffer());

m_Btn1EnableWindow(FALSE);

m_Pid[0]=pidwProcessId;

m_hSTB[0]=OpenProcess(PROCESS_QUERY_INFORMATION,0,m_Pid[0]);

}

}

BOOL

CSwitchDlg::OpenSTB(int

nSTB,PROCESS_INFORMATION

pi)

{

if(!m_PathGetLength())

{

AfxMessageBox(_T("机顶盒在哪里?请指明路径"));

return

FALSE;

}

STARTUPINFO

si;

memset(&si,0,sizeof(si));//若不清0,那么将包含主调线程栈上的垃圾数据

sicb=sizeof(si);

siwShowWindow=SW_SHOW;

sidwFlags=STARTF_USESHOWWINDOW;

CString

cmd;

cmdFormat(_T("STB%d"),nSTB);

if(CreateProcess(m_Path,

cmdGetBuffer(),NULL,FALSE,NULL,NULL,NULL,NULL,&si,pi))

{

CloseHandle(pi->hProcess);

CloseHandle(pi->hThread);

//关闭到子进程的主线程内核对象的句柄

return

TRUE;

}

else

{

MessageBox(_T("打开机顶盒失败,请选择正确的路径"));

return

FALSE;

}

}

我这个代码是从一个进程中打开另一个进程。你可以模仿一下

下面是遍历系统中正在运行的进程的

代码:

PROCESSENTRY32

pe32;

pe32dwSize

=

sizeof(pe32);

//创建进程快照

HANDLE

hProcessSnap

=

CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,

0);

BOOL

bMore

=

Process32First(hProcessSnap,

&pe32);

//遍历系统中运行的进程

while(bMore)

{

//在这里做你想做的事情

}

HANDLE GetProcessHandle(int nID)

{

return OpenProcess(PROCESS_ALL_ACCESS, FALSE, nID);

}

HANDLE GetProcessHandle(LPCTSTR pName)

{

HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);

if (INVALID_HANDLE_VALUE == hSnapshot) {

return NULL;

}

PROCESSENTRY32 pe = { sizeof(pe) };

BOOL fOk;

for (fOk = Process32First(hSnapshot, &pe); fOk; fOk = Process32Next(hSnapshot, &pe)) {

if (!_tcscmp(peszExeFile, pName)) {

CloseHandle(hSnapshot);

return GetProcessHandle(peth32ProcessID);

}

}

return NULL;

}

PS你的代码不够精炼,所以重新写了一个。你看下这个能用不,不能用再帮你找找你的错误。主要你的代码太长了,所以没细看,你的Pn酱紫初始化啊,还有既然是DLL的,那就应该分别做LPCWSTR和LPCSTR两个版本,看你在LPCSTR版本里还用Process32FirstW,是不是有些混乱了?Pn被填充了UNICODE字符集再去和LPCSTR做比较,怎么能得出正确结果呢? 还有那个那个连COM的东西也出来了,完全被雷倒了,休克中

===================================

贴上来的代码都已很负责任的运行通过,不会有错你再检查看看是由于什么引起编译错误可以把出错信息贴上来然后帮你分析看看

另外,workingroy说要提权,DLL是不是应该自作主张提权有待商榷,提权完全可以由客户程序负责决定可以在调用函数前提权,函数调用完恢复原来的权限另外就是提权 *** 作也有消耗,对于系统管理员身份运行(通常我们都是系统管理员身份登陆WINDOWS),不需要提权当然,有高手指出,VISTA和7对系统管理员的权限已经有了修改,既是是系统管理员,权限也受到了某些限制这个我没研究过持保留意见当然楼主的函数应该在提供一个参数,用来传递要打开的进程句柄的权限一般不需要PROCESS_ALL_ACCESS的

用 GetModuleFileName 函数

函数原形:

BOOL WINAPI GetModuleFileName(HMODULE hModule,LPSTR pszFile,int cch);

用法:

TCHAR szFile[255] = "";

GetModuleFileName(NULL,szFile,255);

以上就是关于用VC++编写程序,像任务管理器那样获得某个进程的句柄数,和线程数全部的内容,包括:用VC++编写程序,像任务管理器那样获得某个进程的句柄数,和线程数、根据进程ID获取进程名VC代码、求VC高手 获取当前进程的主窗口句柄等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9329734.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-27
下一篇 2023-04-27

发表评论

登录后才能评论

评论列表(0条)

保存