【问题标题】:How to check if process is still running on Windows server 2008?如何检查进程是否仍在 Windows Server 2008 上运行?
【发布时间】:2010-01-04 09:08:10
【问题描述】:

我们有两个服务:一个是 32 位的(process1),另一个是 64 位的(process2)。 我们有 process1 用来检查 process2 是否正在运行的代码: 处理 h 进程; RESET_WIN_ERRNO;

hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, ProcessId);
if (hProcess == NULL) {
    os_SetWinErr(err_code);
    return FALSE;
} 
CloseHandle(hProcess);
return TRUE;

此代码在 Windows server 2003 中运行良好,但在 Windows server 2008 中无法运行。 有什么想法吗?

我阅读了有关 Session0 的信息,该服务是在 win2008 中引入的,但在我们的例子中,两者都是服务(除非 Microsoft 非常讨厌 java 将其移至 Session1),因此不应该有任何访问问题。

我找到了这个帖子:http://social.msdn.microsoft.com/forums/en-US/winserver2008appcompatabilityandcertification/thread/c7d7e3fe-f8e5-49c3-a16f-8e3dec5e8cf8/ 这表明 32 位进程不能再访问 64 位进程。 在这里可以做什么?

【问题讨论】:

    标签: c++ windows-server-2008 32-bit openprocess


    【解决方案1】:

    可能是因为32bit进程句柄是4bytes(sizeof指针),64bit进程句柄是8bytes(sizeof指针?)?如果是,则 32 位进程句柄可能不包含 64 位进程句柄。

    http://social.msdn.microsoft.com/Forums/en-US/wlsearchdev/thread/9282b719-fc63-482f-bf42-398e8f03238a 希望这会有所帮助

    【讨论】:

    • 谢谢,我会尝试使用 EnumProcessModulesEx 代替
    • 这不是答案——无论进程是 32 位还是 64 位,句柄本质上都是相同的值。我已经对 WOW64 的部分进行了反汇编,从 32 位 WOW64 句柄到完整的 64 位句柄的转换只是一个符号扩展。
    【解决方案2】:

    编写一个 64 位帮助程序,该程序将使用旧代码进行检查并将结果作为退出代码返回。使用 32 位程序中的 CreateProcess() 运行此程序。

    【讨论】:

    • 我认为辅助程序也会失败,因为它将在 Session1 中运行,而 Session0 无法访问。至少我从 Microsoft 文档中是这样理解的。
    最近更新 更多