1

我将我的应用程序从 Windows 7 32 位移植到 Windows 7 64 位。我发现 API 函数OpenSemaphore总是返回零。此调用适用于 32 位 Windows,但不适用于 64 位 Windows。

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

此外,我OpenSemaphoreCreateSemaphore函数替换了我的应用程序,我的应用程序工作正常,但我仍然对为什么OpenSemaphore函数在 64 位代码中失败感到困惑。

任何知道这个问题的人都可以澄清一下吗?

4

2 回答 2

3

当函数失败时检查错误代码是一个很好的第一步,但你需要确保你理解错误代码的含义。该GetLastError函数可能返回的错误代码记录在此处

在这种情况下,您说错误代码是 2。这对应于ERROR_FILE_NOT_FOUND,这意味着

该系统找不到指定的文件。

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

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

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

考虑到你说如果你打电话CreateSemaphore来创建一个的信号量它会起作用,这让我们很好地找到了答案。很有可能,您尝试通过调用OpenSemaphore函数打开的信号量是由 32 位进程创建的,因此不能被 64 位进程打开或使用。(请记住,文档告诉我们“只有当某个进程已经使用该CreateSemaphore函数创建了信号量时,该函数才会成功”。)如果您在 64 位进程中创建的信号量,则可以毫无问题地打开并使用它.

于 2012-07-26T11:53:35.993 回答
1

OpenSemaphore 和 CreateSemaphore 是两个不同的东西。只有当信号量已经存在时,开放信号量才可用。

来自 MSDN

OpenSemaphore 函数允许多个进程打开同一个信号量对象的句柄。只有当某个进程已经使用 CreateSemaphore 创建了信号量时,该函数才会成功

于 2012-07-26T11:50:21.877 回答