c++ - 为什么 CreateSemaphore 工作时 OpenSemaphore 在 64 位 Windows 7 中总是返回零?

标签 c++ winapi windows-7 64-bit semaphore

我将我的应用程序从 Windows 7 32 位移植到 Windows 7 64 位。我发现 API 函数 OpenSemaphore 总是返回零。此调用在 32 位 Windows 中运行良好,但在 64 位 Windows 中运行不佳。

当我调用 GetLastError() 时,它返回 2。

我还用 CreateSemaphore 函数替换了我的 OpenSemaphore 并且我的应用程序工作正常,但我仍然对为什么 OpenSemaphore 函数是64 位代码失败。

哪位知道这个问题的能不能解释一下?

最佳答案

在函数失败时检查错误代码是很好的第一步,但您需要确保您了解该错误代码的含义。 GetLastError function 返回的可能错误代码已记录 here .

在这种情况下,你说错误代码是2。它对应于ERROR_FILE_NOT_FOUND,意思是

The system cannot find the file specified.

您可能会问自己:文件,什么文件?是的,有时理解错误代码需要一点创造性思维。因此,让我们考虑一下:关于 OpenSemaphore function,“找不到文件”可能意味着什么? ?好吧,其中一个参数是一个字符串,它指定要打开的信号量的名称。这有点像一个文件,对吧?足够接近是一个很好的领导!

那么,您为 lpName 参数指定的值很可能不对应于有效的信号量。我通常会首先检查字符串的大小写——与 lpName 值进行的比较是区分大小写的。但既然你说它曾经在 32 位应用程序中工作,那可能不是这里的问题。

不过,从 32 位到 64 位的转换确实给了我们另一条线索。请记住,32 位和 64 位应用程序是截然不同的野兽,通常不允许相互接触。那么,按理说,64 位应用程序将无法使用 32 位应用程序创建的信号量,反之亦然。

考虑到您说过如果您调用 CreateSemaphore 它会起作用创建一个新的信号量,这使我们能够很好地找到答案。很有可能,您尝试通过调用 OpenSemaphore 函数打开的信号量是由 32 位进程创建的,因此它不能被 64 位进程打开或使用过程。 (请记住,documentation 告诉我们“仅当某些进程已经使用 CreateSemaphore 函数创建了信号量时,该函数才会成功”。)如果您创建一个 < em>new 64位进程中的semaphore,打开使用没有问题。

关于c++ - 为什么 CreateSemaphore 工作时 OpenSemaphore 在 64 位 Windows 7 中总是返回零?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11668578/

相关文章:

c++ - 如何避免写入核心文件并加速回溯生成

windows - TokenUser 和 TokenOwner 的区别

Windows 7 自定义搜索提供程序的安全问题

java - 违反 UNIQUE KEY 约束。无法在对象中插入重复的键

c++ - QT4 如何使用静态字段?

c++ - 奇怪的 C++ 字符串连接行为

c++ - 如何从内部运算符构造函数正确调用复制构造函数?

c# - 更改系统时间不接受时区

c++ - 如何调试垃圾堆/没有.dmp/用户的机器

css - 解决 IE9 中桌面缩放的 CSS vw 错误