也就是怎么能获取当前系统的所有进程名?然后一一比较
在线等100分。
在线等100分。
解决方案 »
- Listctrl重绘, 窗口移动后, 垂直滚动条无效
- 我怎么不能给某个程序安装钩子??
- .NET 开发BHO插件,FileDownload 事件处理程序无效怎么办? 为什么在c#下使用IDownloadManager“自定义IE下载管理器”无效呢?
- cwinapp cwnd 的区别
- 如何判断一个窗口是否有最小化按钮
- 关于CListView和CListCtrl的问题,请帮帮忙。
- WIN98客户端如何登陆WIN2K SERVER。急!急!急!
- 怎么样去实现图标的修改?
- socket通讯的数据丢失问题
- 一个捆扰我很久的问题。
- 如何在vc对话框中镶入word文档?
- 如何将CString 的字符转换成 char * ?
作者: eyas http://www.ey4s.org Windows2000中有个工具taskmgr.exe就可以比较详细的查看当前系统进程信息,但是那是Windows GUI程序,有时候是不是觉得命令行下的东西更方便呢?其实已经有不少命令行下的枚举系统进程的工具了,M$的Resource Kit中好象也有,但去了解他们是怎么实现的,自己动手做出来,是不是更有意思呢:) 进程通常被定义为一个正在运行的程序的实例,它由两部分组成: <1>操作系统用来管理进程的内核对象。内核对象也是系统用来存放关于进程的统计信息的地方。 <2>地址空间。它包含所有可执行模块或DLL模块的代码和数据。它还包含动态内存分配的空间,如线程的堆栈和堆分配空间。 枚举系统进程的实现方法大概有四种,其中有一种可以用来枚举远程NT系统的进程,前提是有远程系统的管理员权限。 <<第一部分:调用PSAPI函数枚举系统进程>> M$的Windows NT开发小组开发了自己Process Status函数,包含在PSAPI.DLL文件中,这些函数只能在高于NT4.0以后的版本中使用。PSAPI一共有14个函数[实际PSAPI.DLL输出函数有19个,但其中有5个函数有两个版本,分别是ANSI和Unicode版本],通过调用这些函数,我们可以很方便的取得系统进程的所有信息,例如进程名、进程ID、父进程ID、进程优先级、映射到进程空间的模块列表等等。为了方便起见,以下的例子程序只获取进程的名字和ID。 简单的程序如下:/*************************************************************************Module:ps.c说明:调用PSAPI函数枚举系统进程名和ID,Only for NT/2000*************************************************************************/#include <windows.h>#include <stdio.h>#include "psapi.h" #pragma comment(lib,"psapi.lib") void PrintProcessNameAndID( DWORD processID ){ char szProcessName[MAX_PATH] = "unknown"; //取得进程的句柄 HANDLE hProcess = OpenProcess( PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, processID ); //取得进程名称 if ( hProcess ) { HMODULE hMod; DWORD cbNeeded; if ( EnumProcessModules( hProcess, &hMod, sizeof(hMod), &cbNeeded) ) GetModuleBaseName( hProcess, hMod, szProcessName, sizeof(szProcessName) ); } //回显进程名称和ID printf( "\n%-20s%-20d", szProcessName, processID ); CloseHandle( hProcess );} void main( ){ DWORD aProcesses[1024], cbNeeded, cProcesses; unsigned int i; //枚举系统进程ID列表 if ( !EnumProcesses( aProcesses, sizeof(aProcesses), &cbNeeded ) ) return; // Calculate how many process identifiers were returned. //计算进程数量 cProcesses = cbNeeded / sizeof(DWORD); // 输出每个进程的名称和ID for ( i = 0; i < cProcesses; i++ ) PrintProcessNameAndID( aProcesses[i] ); return;}
**********************************************************************/
#include <windows.h>
#include <tlhelp32.h>
#include <stdio.h>int main()
{ HANDLE hProcessSnap = NULL; PROCESSENTRY32 pe32 = {0}; hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if (hProcessSnap == (HANDLE)-1) { printf("\nCreateToolhelp32Snapshot() failed:%d",GetLastError()); return 1;} pe32.dwSize = sizeof(PROCESSENTRY32); printf("\nProcessName ProcessID"); if (Process32First(hProcessSnap, &pe32)) { do {printf("\n%-20s%d",pe32.szExeFile,pe32.th32ProcessID); }while (Process32Next(hProcessSnap, &pe32)); } else { printf("\nProcess32Firstt() failed:%d",GetLastError()); } CloseHandle (hProcessSnap);return 0;} <<第三部分:调用NTDLL.DLL中未公开API枚举本地系统进程>>
第一部分和第二部分说的是调用MS公开的API来枚举系统进程,在NTDLL.DLL中其实有一个未公开API,也可以用来枚举系统进程。此方法是从别处看来的,我可没这本事自己发现哦,出处记不清楚了,好像是pwdump2 中的源代码中的一部分吧。 OK!那个未公开API就是NtQuerySystemInformation,使用方法如下:////////////////////////////////////////////////////////////////////////////////#include <windows.h>#include <stdio.h>#include <stdlib.h> typedef unsigned long NTSTATUS;typedef unsigned short USHORT;typedef unsigned long ULONG;typedef unsigned long DWORD;typedef long LONG;typedef __int64 LONGLONG;typedef struct { USHORT Length; USHORT MaxLen; USHORT *Buffer;} UNICODE_STRING; struct process_info { ULONG NextEntryDelta; ULONG ThreadCount; ULONG Reserved1[6]; LARGE_INTEGER CreateTime; LARGE_INTEGER UserTime; LARGE_INTEGER KernelTime; UNICODE_STRING ProcessName; ULONG BasePriority; ULONG ProcessId;}; typedef NTSTATUS (__stdcall *NtQuerySystemInformation1)( IN ULONG SysInfoClass,IN OUT PVOID SystemInformation, IN ULONG SystemInformationLength, OUT PULONG RetLen ); int main(){ HINSTANCE hNtDll; NtQuerySystemInformation1 NtQuerySystemInformation; NTSTATUS rc; ULONG ulNeed = 0; void *buf = NULL; size_t len = 0; struct process_info *p ; int done; hNtDll = LoadLibrary ("NTDLL"); if (!hNtDll) return 0; NtQuerySystemInformation = (NtQuerySystemInformation1)GetProcAddress (hNtDll, "NtQuerySystemInformation"); if (!NtQuerySystemInformation) return 0; do { len += 0x1000; buf = realloc (buf, len); if (!buf) return 0; rc = NtQuerySystemInformation (5, buf, len, &ulNeed); } while (rc == 0xc0000004); // STATUS_INFO_LEN_MISMATCH if (rc <0) { free (buf); return 0; } printf("\nProcessName ProcessID"); p = (struct process_info *)buf; done = 0; while (!done) { if ((p->ProcessName.Buffer != 0)) { printf("\n%-20S%d",p->ProcessName.Buffer,p->ProcessId); } done = p->NextEntryDelta == 0; p = (struct process_info *)(((char *)p) + p->NextEntryDelta); } free (buf); FreeLibrary (hNtDll); return 0;}
char* pFileName = "x:\\xxx\\test.exe";try
{
::Deletefile(pFileName);
}catch(CException* e)
{
if(e->.....)
//说明在运行
}
hMutex = CreateMutex(NULL, false, AfxGetApp()->m_pszAppName);
if(::GetLastError() == ERROR_ALREADY_EXISTS)
{
HANDLE hMap = CreateFileMapping( (HANDLE)0xFFFFFFFF, NULL,
PAGE_READWRITE, 0, 128, "wl-tsui" );
if(hMap == NULL) // 如果创建失败
{
AfxMessageBox("创建用于互斥运行的内存映射文件对象失败!",
MB_OK|MB_ICONSTOP);
return FALSE;
}
else
{
if( GetLastError() == ERROR_ALREADY_EXISTS )
{
LPVOID lpMem = MapViewOfFile(hMap, FILE_MAP_WRITE, 0,0,0);
CString str=(char)lpMem;
UnmapViewOfFile(lpMem);
CloseHandle(hMap);
AfxMessageBox(str, MB_OK|MB_ICONSTOP);
return FALSE;
}
else
{
LPVOID lpMem=MapViewOfFile(hMap, FILE_MAP_WRITE, 0,0,0);
strcpy((char*)lpMem, "程序正在运行!");
UnmapViewOfFile(lpMem);
}
AfxEnableControlContainer();
} //这里可以在InitInstance函数最后returnFALSE之前调用
CloseHandle(hMap); //关闭内存映射文件对象句柄
return FALSE;
}
FindFirstProcess()... next..
FindFirstProcess()
...
请看MSDN中SDK函数说明。要代码的话给我发EMAIL:[email protected]