利用共享数据段实现限制EXE单实例运行
2010-03-28 20:40
141 查看
(本站文章均出自原创,转载请注明出处~)
确保你的程序只有一个进程实例在运行有很多种方法,利用共享数据段的方法最简单方便。
一个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
}
确保你的程序只有一个进程实例在运行有很多种方法,利用共享数据段的方法最简单方便。
一个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
}
相关文章推荐
- 利用共享数据段实现限制EXE单实例运行
- 利用共享数据段实现限制EXE单实例运行
- 利用互斥对象实现一个程序只运行一个实例的方法.
- 进程地址空间的共享(可以实现一个程序只有一个实例运行)
- 利用Mutex实现应用程序的单实例运行
- C++实现矩阵链乘法利用动态规划及运行实例结果
- 利用内核对象----互斥量实现应用程序只运行一个实例
- C#利用Mutex实现只运行一个程序实例
- C++实现矩阵链乘法利用动态规划及运行实例结果
- 利用Mutex实现应用程序的单实例运行
- PHP利用文件锁实现只运行一个实例
- 利用Mutex实现应用程序的单实例运行
- System.Threading.Mutex:一台电脑上面只有一个进程实例在运行,利用Mutex互斥量可以实现了这个功能
- C++实现矩阵链乘法利用动态规划及运行实例结果
- C#利用Mutex互斥量实现同时只有一个进程实例在运行
- C++实现矩阵链乘法利用动态规划及运行实例结果
- C++实现矩阵链乘法利用动态规划及运行实例结果
- 利用Mutex实现应用程序的单实例运行
- 利用C#线程机制实现应用程序的单实例运行
- C++ 一个exe的两个运行实例之间共享数据