【发布时间】:2012-01-26 12:36:20
【问题描述】:
我正在编写一个具有共享内存的应用程序,并正在创建命名互斥体,并在名称上使用适当的"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);
}
【问题讨论】:
-
"如果函数失败,返回值为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