createmutex
http://blog.sina.com.cn/s/blog_149e9d2ec0102wyr0.html
在编程中我们常使用程序创建一个互斥的内核对象,目的就是为了让这个程序只能运行一次。我们都会有这样一个经历,那就是如果我们的打开一个游戏或者其他应用程序,会发现如果想在打开这个游戏,会出现打不开的情况,那是因为使用的是互斥的方式打开。当然我们在编写程序时也是可以写成进程间共享,就想QQ一样可以同时打开多个应用程序。
1. 我们需要一个关键的函数:Createmutex().这个函数的具体信息大家可以自己百度或查找MSDN。此处我仅仅讲解它的使用。
这个函数有三个参数,特别是第三个参数控制时候可以内存共享。如果你写一个名字比如:
handle hNutex = CreateMutex(NULL, FALSE, L"stf"); //表示创建一个名为stf的互斥内核对象,那么这个程序仅仅在同一台计算机上被允许打开一次。如果再次打开就会出现错误。
HANDLE hNutex = CreateMutex(NULL, FALSE, NULL); //表示创建匿名互斥内核对象,那么这个程序就会被允许多次打开。
我们查看一下相关代码:
#include
#include
int _tmain()
{
HANDLE hNutex = CreateMutex(NULL, FALSE, NULL);//创建一个名字叫NULL的互斥内核对象
//匿名内核对象,就是没有名字的内核对象,这种内核对象,不能在进程间共享
//命名内核对象可以在进程间共享
if (ERROR_ALREADY_exists == GetLastError())
{
_tprintf(L"%s\n", L"This is the next instance! and session id is ");
return 0;
}
Dword sessionid = 0;
ProcessIdToSessionId(GetProcessId(NULL), &sessionid);
_tprintf(L"%s\n", L"This is the first instance! and session id is ");
_gettchar();
return 0;
}
HANDLE hNutex = CreateMutex(NULL, FALSE, L"stf"); //创建命名内核对象。
大家可以通过CreateMutex的第三个参数的修改来确定是哪一个值。
2. 创建本地命名对象和全局命名对象
其实这个还是很简单的如果要创建本地内核对象,只需要在命名对象名字前面加一个local就行了。如果需要创建全局对象,那么只需要在命名对象前面加一个Global就可。分别如下:
HANDLE hNutex = CreateMutex(NULL, FALSE, L"Local\\stf"); //创建本地内核对象
HANDLE hNutex = CreateMutex(NULL, FALSE, L"Global\\stf"); //创建全局内核对象
但是需要注意的是Session不要轻易使用。即HANDLE hNutex = CreateMutex(NULL, FALSE, L"Session\\stf");少用。
相关阅读
CreateMutex、WaitForSingleObject、ReleaseMutex——
CreateMutexCreateMutex作用是找出当前系统是否已经存在指定进程的实例。如果没有则创建一个互斥体。互斥对象是系统内核维护的一