在线急等:知道了程序的可执行文件名?如何获得这个程序的进程句柄?
解决方案 »
- #include <winsock2.h>的问题
- 如何编程获取账户类型啊
- 写过 FTP客户端的朋友进来看看啊
- 请问这里有高人用过Measurement Studio 6.0,有问题请教
- 安装VC6.0出现问题
- 有哪位老大能告诉我TCP粘包是怎么回事?解决方法有吗?(越多越好)
- 有关CRichEditCtrl和HTML的问题,请教一哈,感激不尽!
- CRAZY!疯了!!error C2059: syntax error : 'PCH creation point'
- 用CDatabase类和CRecordSet类连接数据源有区别吗??
- 类型转换?
- 请教: VC6有代码优化吗?
- 怎么实现阻塞和释放数据包
LPCTSTR lpModuleName // module name
);
OpenProcess to get the process's handle.
{
DWORD dwRet = 0;
HANDLE hProcessSnap = NULL;
PROCESSENTRY32 pe32 = {0};
TCHAR szImagePath[MAX_PATH] = {0};
hProcessSnap = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 );
if ( hProcessSnap == INVALID_HANDLE_VALUE )
{
return dwRet;
}
pe32.dwSize = sizeof( PROCESSENTRY32 );
if( !Process32First( hProcessSnap, &pe32 ) )
{
CloseHandle( hProcessSnap ); // Must clean up the snapshot object!
return dwRet;
}
do
{
//If Is System ProcessID Skip It.
if ( pe32.th32ProcessID==0 || pe32.th32ProcessID==4 )
{
continue;
}
if (!lstrcmpi(lpName, pe32.szExeFile))
{
dwRet = pe32.th32ProcessID;
break;
}
ZeroMemory(&szImagePath,sizeof(szImagePath));
if ( GetProcessPathByID(pe32.th32ProcessID,szImagePath) )
{
if (!lstrcmpi(lpName, szImagePath))
{
dwRet = pe32.th32ProcessID;
break;
}
}
} while( Process32Next( hProcessSnap, &pe32 ) );
// Don't forget to clean up the snapshot object!
CloseHandle( hProcessSnap );
return dwRet;
}BOOL GetProcessPathByID(DWORD dwPID, LPTSTR lpOut)
{
BOOL bRet = FALSE;
HANDLE hModuleSnap = INVALID_HANDLE_VALUE;
MODULEENTRY32 me32;
// Take a snapshot of all modules in the specified process.
hModuleSnap = CreateToolhelp32Snapshot( TH32CS_SNAPMODULE, dwPID );
if( hModuleSnap == INVALID_HANDLE_VALUE )
{
return bRet;
}
// Set the size of the structure before using it.
me32.dwSize = sizeof( MODULEENTRY32 );
if( !Module32First( hModuleSnap, &me32 ) )
{
CloseHandle( hModuleSnap ); // Must clean up the snapshot object!
return bRet;
}
lstrcpyn(lpOut, me32.szExePath ,MAX_PATH); // Don't forget to clean up the snapshot object.
CloseHandle( hModuleSnap );
return( TRUE );
return bRet;
}
*这可以像任务管理器一样直接列出现在执行的进程,主要函数用到
* HANDLE WINAPI CreateToolhelp32Snapshot(
* DWORD dwFlags,
* DWORD th32ProcessID
* );
* 用到的主要结构是: PROCESSENTRY32
* 定义如下:
* typedef struct tagPROCESSENTRY32 {
* DWORD dwSize;
* DWORD cntUsage;
* DWORD th32ProcessID;
* ULONG_PTR th32DefaultHeapID;
* DWORD th32ModuleID;
* DWORD cntThreads;
* DWORD th32ParentProcessID;
* LONG pcPriClassBase;
* DWORD dwFlags;
* TCHAR szExeFile[MAX_PATH];
* } PROCESSENTRY32, *PPROCESSENTRY32;
* 这个结构描述了当“快照”生成时,系统内进程的列表。
*/char TargetName[]="GameLogin.exe"; //要寻找进程的文件名
HANDLE Snapshot; //内存进程的“快照”句柄//返回内存所有进程的快照。参数为TH32CS_SNAPPROCESS取有的进程,此时忽略参数2;
Snapshot=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);PROCESSENTRY32 processListStr;
processListStr.dwSize=sizeof(PROCESSENTRY32);
BOOL return_value;//下面的函数取快照中的第一个进程条目,成功返回一个TRUE,反之FALSE
return_value=Process32First(Snapshot,&processListStr);//下面的部分把快照中所有找到的进程的ID保存在向量ProcessID中
//这个ID就是我们在程序管理器的进程中看到的PID一列的数值
std::vector<DWORD> ProcessID;
while(return_value)
{
if( 0==(strcmp(TargetName,processListStr.szExeFile)) )
{
ProcessID.push_back(processListStr.th32ProcessID);
}
return_value=Process32Next(Snapshot,&processListStr);
}/**下面可用函数HANDLE OpenProcess(
* DWORD dwDesiredAccess,
* BOOL bInheritHandle,
* DWORD dwProcessId
* ); 用这个函数由PID得到进程句柄
*/
for(std::vector<DWORD>::iterator it=ProcessID.begin();
it!=ProcessID.end();++it)
{
if(*it)
{
HANDLE FindProcess;
FindProcess=OpenProcess(PROCESS_ALL_ACCESS,FALSE,*it);
if(FindProcess)
{
//找到了进程句柄,这里加你的代码如下面的关掉进程
//TerminateProcess(FindProcess,0);
}
}
}//用以上的方法可以得到系统内的所有进程的句柄,可用来查看或进一步编程以达到其它目的。