以下示例说明通过创建和打开命名对象来使用对象名称。
互斥
第一个进程使用CreateMutex函数创建互斥对象。请注意,即使存在具有相同名称的现有对象,该函数也会成功。
//一个进程创建互斥对象。
HANDLE hMutex;
DWORD dwErr;
hMutex = CreateMutex(
NULL, //没有安全描述符
FALSE, //互斥体不拥有
"NameOfMutexObject"); //对象名称
if (hMutex == NULL)
printf("CreateMutex error: %d\n", GetLastError() );
其他
if ( GetLastError() == ERROR_ALREADY_EXISTS )
printf("CreateMutex opened existing mutex\n");
其他
printf("CreateMutex created new mutex\n");
第二个过程使用OpenMutex函数来打开现有互斥体的句柄。如果具有指定名称的互斥对象不存在,则此函数将失败。访问参数请求完全访问互斥体对象,这是在任何等待功能中使用的句柄所必需的。
//另一个进程打开现有互斥体的句柄。
HANDLE hMutex;
hMutex = OpenMutex(
MUTEX_ALL_ACCESS, //请求完全访问
FALSE, // Create or open a named semaphore.
"NameOfMutexObject"); //对象名称
if (hMutex == NULL)
printf("OpenMutex error: %d\n", GetLastError() );
信号
以下示例使用CreateSemaphore函数来说明如果对象已存在,则命名对象创建操作失败。
HANDLE CreateNewSemaphore(LPSECURITY_ATTRIBUTES lpsa,
LONG cInitial,龙的Cmax,LPTSTR lpszName)
{
HANDLE hSem;
//创建或打开一个命名的信号量。
hSem = CreateSemaphore(
lpsa, //安全属性
cInitial, //初始计数
cMax, //最大计数
lpszName); //信号量名称
//关闭句柄,如果现在的信号量打开,则返回NULL。
if (hSem != NULL && GetLastError() == ERROR_ALREADY_EXISTS)
{
CloseHandle(hSem);
return NULL;
}
//如果创建了新的信号量,则返回句柄。
return hSem;
}