利用共享数据段实现限制EXE单实例运行
(本站文章均出自原创,转载请注明出处~)
确保你的程序只有一个进程实例在运行有很多种方法,利用共享数据段的方法最简单方便。
一个EXE文件是有不同的段(Section)组成的,其中有若干代码段和若干数据段。在默认情况下,
操作系统为了确保每个进程实例在安全环境中运行会为每个进程实例创建自己的数据段的拷贝,
这样多个进程实例就不会因为一个实例修改了数据段的内容而影响到另外的进程实例。但是我们
也可以为EXE创建共享数据段,这样多个进程实例就可以共享这个数据段而不会拥有自己的拷贝。
因此我们可以在共享数据段里存放一个变量来表示目前进程实例的数量,从而实例我们的目标。
创建共享数据段的方法是使用编译器指令:
#pragma data_seg("Shared)
unsigned long g_InstanceCount = 0;
#pragma data_seg()
这样就在EXE文件中创建了一个共享数据段,里面只存放一个变量g_InstanceCount,所有的进程实例
都可以访问并修改这个变量。
然后还应该告诉链接器该数据段的属性:
#pragma comment(linker,"/SECTION:Shared,RWS")
这段代码是在链接时给链接器的附加命令:/SECTION:Shared,RWS。RWS表示这个数据段的属性
是:可读(Read)、可写(Write)、共享(Share)。
然后在你的程序入口点你可以访问g_InstanceCount 来获取当前进程实例的数量,例如:
#pragma data_seg("Shared)
unsigned long g_InstanceCount = 0;
#pragma data_seg()
#pragma comment(linker,"/SECTION:Share,RWS")
int main()
{
++g_InstanceCount;
if(g_InstanceCount > 1)
{
exit(0);
}
//your normal code here
}