我正在为我正在编写的程序使用 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。