【发布时间】:2018-04-16 12:32:56
【问题描述】:
我正在尝试关闭另一个应用程序中的互斥锁。
我正在使用 WinAPI(“windows.h”)。
这是我关闭此互斥锁的代码:
DWORD pid = 0;
hMyWnd = FindWindow(NULL, "TheFamousWindowName");
GetWindowThreadProcessId(hMyWnd, &pid);
HANDLE hProc = OpenProcess(PROCESS_DUP_HANDLE, 0, pid);
HANDLE hMutex = OpenMutex(MUTEX_ALL_ACCESS, false, "TheEvilMutex"); // hMutex isn't null
WaitForSingleObject(hMutex, 10000); // Wait 10 seconds, nothing happens
if (!DuplicateHandle(hProc, hMutex, NULL, 0, 0, false, DUPLICATE_CLOSE_SOURCE)) {
// Arrive always here because of error 288
// And the mutex is still there, not closed
}
ReleaseMutex(hMutex);
CloseHandle(hMutex);
问题是当我打电话时
DuplicateHandle(hProc, hMutex, NULL, 0, 0, false, DUPLICATE_CLOSE_SOURCE)
我收到了错误 288
GetLastError()
标记为“尝试释放不属于调用者的互斥锁”并且互斥锁未关闭
现在,我知道我不是所有者,但我看不到关闭此互斥锁的解决方案。
我见过一些程序这样做,例如 Process Explorer 或 Process Hacker。我在 GitHub 上查看了最后的代码,但没有找到任何关于它如何在不成为所有者的情况下关闭互斥锁的信息。
我也检查了这个帖子 how does procexp close a mutex held by another process? 但我无法让它工作。
感谢您阅读我。 希望有人可以帮助我。
编辑:
感谢@RbMm,替换了
DuplicateHandle(hProc, hMutex, NULL, 0, 0, false, DUPLICATE_CLOSE_SOURCE)
与
DuplicateHandle((HANDLE)-1, hMutex, NULL, 0, 0, false, DUPLICATE_CLOSE_SOURCE)
解决了错误 288,但互斥锁并未因此关闭。
【问题讨论】:
-
您只能释放一个已等待(ed) 的互斥锁:"...或通过在调用其中一个等待函数时指定其句柄。..." i> msdn.microsoft.com/en-us/library/windows/desktop/…
-
C != C++。仅使用您正在使用的语言进行标记,除非两者确实相关。
-
寻求调试帮助的问题(“为什么这段代码不起作用?”)必须在问题本身中包含所需的行为和重现它所需的最短代码。请阅读如何创建minimal reproducible example。
-
@tambre 谢谢,我已尝试根据您的建议改进我的问题。
-
这闻起来像an XY problem。为什么,为什么,你想通过摆弄它的互斥锁来破坏另一个应用程序?你真正想做什么?
标签: c++ c winapi mutex ownership