如何判断一个进程是否是自身进程的一个实例?
比如说做了一个程序叫a.exe, 然后将它拷贝成(文件名不一定一样)b.exe,c.exe,....xxx.exe,然后分别运行,它得到进程快照,然后遍历进程句柄,
但它怎样判断得到的一个进程句柄是否是自己的一个实例呢?
ReadProcessMemory(?)?
请大家具体点好吗
比如说做了一个程序叫a.exe, 然后将它拷贝成(文件名不一定一样)b.exe,c.exe,....xxx.exe,然后分别运行,它得到进程快照,然后遍历进程句柄,
但它怎样判断得到的一个进程句柄是否是自己的一个实例呢?
ReadProcessMemory(?)?
请大家具体点好吗
解决方案 »
- opengl vc交流群
- 很快就结贴:#define SHCreateDirectoryEx SHCreateDirectoryExA
- 如何获取IE缓存中文件的Internet地址
- 请教如何抓取网页上的所有文字,详细请进
- 为什么有的avi格式的视频用CAnimateCtrl控件播放不了啊?CAnimateCtrl控件都能播放什么格式的视频啊
- GetScrollPosition()问题
- 怎么在视图中使得主框架上的工具栏按钮失效(disable)
- 自定义消息?
- 谁有远程注入DLL的源代码?给我一份好吗?
- 请哪位高手介绍一个dumpbin.exe的使用方法以及比较好的相关的小软件
- 菜鸟急问,关于OCX,怎么在VC中用OCX啊?怎么才能调用OCX里面的函数呢?
- 考试问题,大家帮帮忙
然后自己再调用GetCurrentProcessID() == 进程快照得到的ID
就可以了。
看懂就结贴,最好能提交一下FAQ看能不能给俺加点信誉分,嘿嘿……小于100已经很久了。
#pragma data_seg("new_data_sec")
DWORD dwProcessIds[1024]={0}; // 保留1024个位置,用于存储ProcessId
#pragma data_seg()
// 将这个数据段设置为共享段……
#pragma comment(linker, "/section:new_data_sec,RWS")……
……int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
……
for(int i=0;i<1024;i++)
{
if(dwProcessIds[i] != 0)// 打印出已有的id
{
printf("Instance No.%d:0x%08x", i, dwProcessIds[i]);
}
else // 找到一个空白,把自己的ID加入到共享段中……
{
dwProcessIds[i] = GetCurrentProcessId();
break;
}
}
// 继续其它语句
}
假如有文件c:\a.exe; 与文件d:\test\b.exe是同一个可执行文件的拷贝, 同时运行这两个exe文件, 如何判断他们本质上是属于同一个文件的拷贝。
是不是这样啊?如果是的话, halk(天涯海角)的方法就行不通了。共享段只能在同一个exe文件的多个实列实现共享变量,而不能在多个不同名的exe文件共享。我想可以用内存映射文件来实现, 每个exe或同一个exe文件的多个实例启动时,在共享的内存映射文件里登记注册一下它的进程ID,这样访问这个内存映射文件就可以知道有多少个"实例"(你所谓的实例)在运行了。
)
分数确实给少了,确实不好意思(因为我的分不多了)。内存映射文件我一直没用过,我还不知道该怎么用.
参考CreateFileMapping, MapViewofFile等函数的用法。
然后直接对文件进行字节比较
或者进行md5抽样比较
如果相同则认为是同一exe
感觉楼主的问题似乎没有多大意义?
或者说楼主的说法有问题
什么叫一个进程是自身进程的一个实例?
如果你的程序在创建这个名字的Mutex之前,已经有这个Mutex存在,说明已经有一个实例在运行了。用OpenMutex( 0, "Name" )来判断Mutex是否已经创建了。
我意思是说,利用命名Mutex对象在系统中的唯一性来判断你的程序是否已经实例在运行。
这个名字一定要确保不与其他的对象的名字冲突。
2. 再取得自己进程的exe文件名然后比较这两个文件的二进制数据是否相同
我看还不如将EXE文件的头部DOS HEADER部分修改一下,比如:This is my file!,只比较这个字符串就知道了
只要比较进程头部的字符串和上面的字符串就知道是不是自身的多个实例或者其他相同代码EXE的实例
1. 先取得该进程的exe文件名
2. 再取得自己进程的exe文件名-------------“该进程”是指哪个进程?在“自己进程”里如何取得“该进程”的信息。
if(GetLastError()==ERROR_ALREADY_EXISTS){ExitProcess(0);}只要在你的程序开始的地方加入上面的两行,就能保证你的程序只有一个实例在内存中运行了,不管你的.exe被复制成几份,从几个不同的路径运行。
如:
WinMain()
{
HANDLE hmutex=CreateMutex(NULL,true,"set_app_id");
if(GetLastError()==ERROR_ALREADY_EXISTS){ExitProcess(0);}
}
>> 我觉得 msdn_user(蓝天) 的方法有问题:在进程中用GetModuleFileName( )能够取到这个进程的其他实例的exe文件路径吗?baojian88888()
1. 先取得该进程的exe文件名
2. 再取得自己进程的exe文件名-------------“该进程”是指哪个进程?在“自己进程”里如何取得“该进程”的信息。
----------------------------------------人家有说是用GetModuleFileName( )函数来取得其他实例的exe文件路径吗?“该进程”也就是楼主标题“如何判断一个进程是否是自身进程的一个实例? ”中所说的“一个进程”。不好意思,没有描述清楚