我正在编写一个带有共享内存的应用程序,并且正在创建名称上带有相应"Local\"
前缀的命名互斥锁。但是,每次调用CreateMutex
函数来创建句柄时,我都会得到NULL
返回值。我甚至在此之后尝试调用OpenMutex
并获得NULL
返回。
GetLastError()
函数返回6
,表示ERROR_INVALID_HANDLE
。我相信这是在第一次尝试在任何进程中创建这个名为的互斥锁时发生的。在包含一些MFC组件并在应用程序的其他地方使用windows.h
后,我包含了CMutex
;所以我不知道这是不是问题。我总是通过NULL
和FALSE
获取前两个参数,并使用的是Windows XP。
这是我的代码所做的总结:
char to_name[16] = "Local\\to_1";
d_mutex_to_h = CreateMutex(NULL, FALSE, to_name);
if (d_mutex_to_h == NULL)
{
d_mutex_to_h = OpenMutex(NULL, FALSE, to_name);
}
答案 0 :(得分:4)
来自CreateMutex的MSDN文档:
如果lpName与现有事件,信号量,等待计时器,作业或文件映射对象的名称匹配,则函数将失败,GetLastError函数将返回ERROR_INVALID_HANDLE。发生这种情况是因为这些对象共享相同的命名空间。
尝试使用WinObj查看是否存在具有相同名称的非互斥对象。
答案 1 :(得分:1)
CreateMutex()
将LPCTSTR
作为最后一个参数。如果定义LPCWSTR
,则为UNICODE
,否则为LPCSTR
。但是,您正在传递指向char
字符串的指针。如果您的程序是使用UNICODE
定义的,则可能会导致问题。
尝试使用此代码,看看它是否会发生任何变化:
d_mutex_to_h = CreateMutex(NULL, FALSE, _T("your_mutex_name_here"));