【问题标题】:Problem in using WaitForSingleObject on 64bit OS在 64 位操作系统上使用 WaitForSingleObject 的问题
【发布时间】:2009-08-13 04:23:19
【问题描述】:

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

在 32 位 Windows XP 上可以正常工作,但是当我在 64 位 Windows XP 上使用时,它就无法正常工作。

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

有人知道为什么吗?

在 WinXP 64bit 中是否可以替代该方法?

【问题讨论】:

  • 您的进程是在 wow64 仿真下运行,还是本机 x64 应用程序?当然这是 x64 支持的 API。
  • 这是一个简单的 exe 文件,以 32 位进程启动......
  • 这个问题并没有足够的信息来做出非常有根据的猜测。
  • 对 CodeBenders 回答的评论表明等待的句柄是一个进程句柄。

标签: c++ winapi synchronization 64-bit


【解决方案1】:

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

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

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

【讨论】:

  • 我喜欢这个建议。听起来很有道理。
  • SysInternals 实用程序执行此操作,它们将 32 位和 64 位可执行文件与自定义启动器捆绑在一起。 Windows 本身也有可能使用 wow64 做类似的事情......
【解决方案2】:

WaitForSingleObject 函数要么告诉您进程已经“发出信号” (WAIT_OBJECT_0),要么发生错误。要知道哪个,我们需要知道它返回的是什么。如果返回值不是WAIT_OBJECT_0 或WAIT_TIMEOUT,则需要调用GetLastError() 来确定问题所在。

我猜要么进程初始化失败,你得到WAIT_FAILED和GetLastError() == ERROR_INVALID_HANDLE,要么进程已经终止,你得到WAIT_OBJECT_0,但没有更多信息我们真的不能帮助你。

【讨论】:

  • 进程启动成功,我得到 WAIT_OBJECT_0 作为回报,但问题是它应该等待子 exe 完成......它没有做......
【解决方案3】:

我同意 Rob 的观点,WinAPI 不太可能出错:如果它说它已终止,那么它就是。

您是否以某种方式跟踪子进程的输出?它是否有可能在初始化早期失败,例如尝试为错误的平台 (32/64) 加载 DLL 时,根据平台等获取一些指向错误位置的环境变量?

【讨论】:

    【解决方案4】:

    稍作搜索,找到了tcsh 实现的代码:

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

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

    看起来他们可能遇到了与您相同的问题。 WFSO 被注释掉并替换为一组共享事件,新进程和现有进程使用这些共享事件进行通信。也许这是一个常见的问题,甚至是一个尚未修复的 windows 错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-14
      • 1970-01-01
      • 2013-08-29
      • 1970-01-01
      • 2011-07-07
      • 2011-12-18
      相关资源
      最近更新 更多