替代Windows 2000的GetProcessID

Rod*_*ddy 4 c++ windows winapi

我使用GetProcessID意外地从应用程序中删除了Win2K兼容性.

我像这样使用它来获取已启动应用程序的主要HWND.

ShellExecuteEx(&info); // Launch application
HANDLE han = info.hProcess; // Get process

cbinfo.han = han;

//Call EnumWindows to enumerate windows....
//with this as the callback

static BOOL CALLBACK enumproc(HWND hwnd, LPARAM lParam)
{
  DWORD id;
  GetWIndowThreadProcessID(hwnd, &id);
  if (id == GetProcessID(cbinfo.han))
    setResult(hwnd)
 ...
}
Run Code Online (Sandbox Code Playgroud)

任何想法如何在Win2K上实现相同的功能?

Dav*_*idK 6

有一种'不支持的'功能:ZwQueryInformationProcess():见

http://msdn.microsoft.com/en-us/library/ms687420.aspx

给定句柄,这将为您提供进程ID(以及其他内容).这不能保证适用于未来的Windows版本,因此我建议使用一个帮助函数来测试操作系统版本,然后使用GetProcAddress()为XP及更高版本调用GetProcessId(),并仅为Win2K调用ZwQueryInformationProcess() .


Rei*_*man 5

大卫K是对的.请参阅ZwQueryInformationProcess文档中的注释:

[ZwQueryInformationProcess可能会在Windows的未来版本中更改或不可用.应用程序应使用本主题中列出的备用功能.]

这意味着Microsoft可以选择在将来的任何时候删除它,从而破坏您的应用程序.我强烈认为你遵循DavidK的建议并在操作系统上使用不支持GetProcessID的ZwQueryInformationProcess,并在支持它的操作系统上使用GetProcessID(XP SP1及更高版本).