CreateMutex and OpenMutex return NULL

CreateMutex and OpenMutex return NULL

本文关键字:NULL return OpenMutex and CreateMutex      更新时间:2023-10-16

我正在编写一个具有共享内存的应用程序,并在名称上创建具有适当"Local"前缀的命名互斥体。然而,每次我调用CreateMutex函数来创建句柄时,我都会得到一个NULL返回值。我甚至尝试调用OpenMutex之后,得到一个NULL返回。

GetLastError()函数返回6,即ERROR_INVALID_HANDLE。我相信在任何进程中第一次尝试创建这个命名互斥时都会发生这种情况。在包括一些MFC组件后,我包括了windows.h,并在应用程序的其他地方使用CMutex;所以我不知道这是不是个问题。我总是将NULLFALSE传递给前两个参数,并且使用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);
}

来自MSDN文档中的CreateMutex:

如果lpName匹配现有事件、信号量、可等待定时器、作业或文件映射对象的名称,则函数失败,GetLastError函数返回ERROR_INVALID_HANDLE。这是因为这些对象共享相同的命名空间。

尝试使用WinObj查看是否有同名的非互斥对象

CreateMutex()LPCTSTR作为最后一个参数。这是一个宏,如果定义了UNICODE,则为LPCWSTR,否则为LPCSTR。然而,你正在传递一个指针到char字符串。如果你的程序是用UNICODE定义编译的,这可能会导致问题。

试试下面的代码,看看它是否改变了什么:

d_mutex_to_h = CreateMutex(NULL, FALSE, _T("your_mutex_name_here"));