在64位操作系统上使用WaitForSingleObject的问题

时间:2009-08-13 04:23:20

标签: c++ winapi synchronization 64-bit

我在我的程序中使用来自(kernel32.dll)的WaitForSingleObject

它在32位Windows XP上工作正常,但是当我在64位WindowsXP上使用它时,它无效。

问题在于它不会等待进程并且控制向前移动。

有没有人知道为什么?

在WinXP 64bit中是否有替代方法?

4 个答案:

答案 0 :(得分:4)

如果函数的返回值告诉你进程已经终止,那么它可能真的有。

假设您启动的程序带有32位和64位版本。也许32位版本可以检测到它在64位平台上运行,启动64位版本本身,然后终止32位版本。在这种情况下,您的程序将检测到32位子节点的终止,但它将忽略64位“孙子”进程。

您可以使用任务管理器或Process Explorer来确认此假设。找到仍在运行的程序。它的pid和CreateProcess给你的pid一样吗?

答案 1 :(得分:3)

WaitForSingleObject函数要么告诉您该进程已经“发出信号”(WAIT_OBJECT_0),要么发生了错误。要知道哪些,我们需要知道它返回了什么。如果返回值不是WAIT_OBJECT_0WAIT_TIMEOUT,则需要致电GetLastError()以确定错误。

我猜这个过程初始化失败了,你得WAIT_FAILED GetLastError() == ERROR_INVALID_HANDLE,或者过程已经终止,你得到WAIT_OBJECT_0,但没有更多我们无法真正帮助您的信息。

答案 2 :(得分:0)

我同意Rob的看法,WinAPI不太可能是错误的:如果它说它被终止了,那就是。

你是否以某种方式关注子进程的输出?是否有可能在初始化时提前失败,例如当试图为错误的平台(32/64)加载DLL时,根据平台等获取一些指向错误位置的环境变量。?

答案 3 :(得分:0)

稍微进行了一些搜索,发现了tcsh实施的代码:

http://www.opensource.apple.com/source/tcsh/tcsh-60/tcsh/win32/fork.c

(搜索“WaitForSingleObject”的第二个实例)

看起来他们可能遇到过与您相同的问题。 WFSO被注释掉,并被新的和现有进程用于通信的一组共享事件所取代。也许这是一个常见的问题,甚至是一个尚未修复的Windows漏洞。