当函数失败时检查错误代码是一个很好的第一步,但你需要确保你理解错误代码的含义。该GetLastError
函数可能返回的错误代码记录在此处。
在这种情况下,您说错误代码是 2。这对应于ERROR_FILE_NOT_FOUND
,这意味着
该系统找不到指定的文件。
你可能会问自己:文件,什么文件?是的,有时理解错误代码需要一点创造性思维。所以让我们想一想:“找不到文件”对于OpenSemaphore
函数可能意味着什么?好吧,其中一个参数是一个字符串,它指定要打开的信号量的名称。这有点像一个文件,对吧?足够接近成为一个很好的领导!
那么,您为lpName
参数指定的值很可能与有效的信号量不对应。我通常检查的第一件事是字符串的大小写——与lpName
值进行的比较区分大小写。但既然你说它曾经在 32 位应用程序中工作,那可能不是这里的问题。
不过,32 位到 64 位的转换确实给了我们另一个线索。请记住,32 位和 64 位应用程序是非常不同的野兽,通常不允许相互接触。因此,按理说,64 位应用程序将无法使用由 32 位应用程序创建的信号量,反之亦然。
考虑到你说如果你打电话CreateSemaphore
来创建一个新的信号量它会起作用,这让我们很好地找到了答案。很有可能,您尝试通过调用OpenSemaphore
函数打开的信号量是由 32 位进程创建的,因此不能被 64 位进程打开或使用。(请记住,文档告诉我们“只有当某个进程已经使用该CreateSemaphore
函数创建了信号量时,该函数才会成功”。)如果您在 64 位进程中创建新的信号量,则可以毫无问题地打开并使用它.