【问题标题】:CreateMutex and OpenMutex return NULLCreateMutex 和 OpenMutex 返回 NULL
【发布时间】:2012-01-26 12:36:20
【问题描述】:

我正在编写一个具有共享内存的应用程序,并正在创建命名互斥体,并在名称上使用适当的"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);
}

【问题讨论】:

  • "如果函数失败,返回值为NULL。获取扩展错误信息,调用GetLastError。"
  • @AusCBloke 我确实调用了GetLastError,返回在帖子中
  • 哈它也是。当我看到整段文字时,我一定是错过了它或停止阅读。 ://
  • 请注意,如果 CreateMutex 存在,它会打开一个互斥锁 - 所以你不应该在之后尝试 OpenMutex,如果 CreateMutex 失败,这将失败。 createmutex 调用的错误返回是什么? (或者是创建的错误代码,没有打开?)
  • 是的,OpenMutex 在该代码中总是会失败,但我猜ERROR_INVALID_HANDLE 来自CreateMutex 而不是OpenMutex,因为OpenMutex 显然应该返回ERROR_FILE_NOT_FOUND。如果错误来自CreateMutex,这就是MSDN 所说的:“如果 lpName 与现有事件、信号量、可等待计时器、作业或文件映射对象的名称匹配,则函数失败并且 GetLastError函数返回 ERROR_INVALID_HANDLE。”

标签: c++ windows mutex shared-memory


【解决方案1】:

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

试试这段代码,看看它是否改变了什么:

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

【讨论】:

  • 如果这是问题所在,这将失败并出现编译时错误
  • @bdonlan 好点,+1 给你的答案。当 TCHAR 和 char 混合时,仍然可能会出现问题。编译器很可能会看到它。
【解决方案2】:

来自CreateMutex 的 MSDN 文档:

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

尝试使用WinObj 来查看是否存在同名的非互斥对象。

【讨论】:

  • 哦,好的。我对映射的共享内存使用相同的名称。所以我想这会导致这个。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-11
  • 2015-09-08
  • 2022-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多