【发布时间】:2021-03-29 11:39:17
【问题描述】:
我正在使用这篇文章编写我自己的 DebugView 版本:https://www.codeproject.com/Articles/23776/Mechanism-of-OutputDebugString 作为起点。 该代码似乎工作正常。但是我不明白命名互斥体“DBWinMutex”的使用。 这个互斥锁是在代码开头打开的:
CComBSTR DBWinMutex = L"DBWinMutex";
HANDLE m_hDBWinMutex = ::OpenMutex(MUTEX_ALL_ACCESS,
FALSE,
DBWinMutex);
在程序结束前没有关闭!?
我觉得这很奇怪。我认为必须反复锁定和解锁互斥锁,以便 OutputDebugString 可以写入共享内存“DBWIN_BUFFER”?
但是,我能够读取其他程序编写的 OutputDebugString 消息,因此互斥锁似乎不会锁定“DBWIN_BUFFER”以进行写入。 此外,我还可以与我的 DebugView 实现并行运行 DebugView,它们都可以读取 OutputDebugString 消息。因此,似乎互斥锁也不授予对“DBWIN_BUFFER”的独占读取权限。
使用上面的 MUTEX_ALL_ACCESS 访问意味着我必须以管理员身份运行程序。 当我将其替换为 SYNCHRONIZE 访问时,该程序的功能似乎完全相同,只是我不必以管理员身份运行它。 这可以吗?或者它可能会导致一些微妙的错误?
我还测试了上面 OpenMutex 的返回值,如果它为 null,则调用 CreateMutex。
【问题讨论】:
-
OpenMutex返回一个互斥量的句柄。它不获取该互斥体。此外,您无需检查NULL,如果是,则调用CreateMutex。只需使用CreateMutex,它将返回一个现有互斥对象的句柄,或者创建一个新对象。 -
谢谢。但是我如何获得这个互斥锁? WaitForSingleObject(互斥体)?在我参考的文章中,我根本没有看到这个句柄被使用。
-
WaitForSingleObject- 是的,用于获取互斥锁 -
您不需要任何互斥锁来捕获 OutputDebugString 的结果,请参阅此处获取 C 版本 drdobbs.com/a-dbwin32-debugger-for-windows/184403245?pgno=3 和此处获取 .NET github.com/smourier/TraceSpy/blob/master/TraceSpy/Main.cs 或 codeproject.com/Articles/13345/…
-
@SimonMourier:谢谢。但是存在一个名为“DBWinMutex”的互斥锁。如果这个互斥锁不能确保一次只有一个线程访问“DBWIN_BUFFER”共享内存,它会做什么?