2

我正在为我正在编写的程序使用 WINAPI。程序拥有另一个进程的 ProcessId,需要获取它的句柄(以便以后能够终止它,并定期检查进程是否处于活动状态并使用 WaitForSingleObject 响应)。当我编译我的程序时(在 Embarcadero RAD Studio 2010 C++ Builder 中),它运行良好;该程序似乎成功地获得了句柄,并且通常按预期工作。但是,如果我从文件夹中将它作为独立的 exe 启动,它似乎无法正确获取句柄。我通过比较检查了它(Companion 是 HANDLE,Companion_PID 是 DWORD):

GetProcessId(Companion)

Companion_PID

其中,前面几行,Companion 取自 Companion_PID 在以下代码中:

Companion = OpenProcess(PROCESS_ALL_ACCESS, FALSE, Companion_PID);

并且“GetProcessId(Companion)”结果为 0(这是 OpenProcess 未能返回正确句柄的好兆头。

当从编译器运行和作为独立 exe 运行时,这段代码的工作方式不同,我感到非常惊讶;我假设在第一种情况下,安全属性是从编译器本身继承的,但我想从在 WINAPI 和安全属性方面更有经验的人那里听到可能更好的解释。

小更新:是的,就像我想的那样,OpenProcess 导致错误 0x5 = ERROR_ACCESS_DENIED。

4

1 回答 1

3

从MSDN 中的OpenProcess 功能页面:

要打开另一个本地进程的句柄并获得完全访问权限,您必须启用 SeDebugPrivilege 权限。

我相信您的 IDE(您正在从IDE运行您的应用程序,而不是从compilerSeDebugPrivilege默认启用。当您运行应用程序时,您的 IDE(进程)正在创建一个从 IDE 继承权限的新进程,这SeDebugPrivilege就是从 IDE 运行时函数成功的原因。

您的应用程序应该检查它是否已SeDebugPrivilege启用,如果没有,请启用它

于 2012-02-09T15:58:21.940 回答