在Windows

时间:2017-11-13 00:28:20

标签: c windows

我遇到了这个功能:

DWORD WINAPI GetWindowThreadProcessId(
  _In_      HWND    hWnd,
  _Out_opt_ LPDWORD lpdwProcessId
);

GetWindowThreadProcessId:

  • hWnd [in](处理窗口)

  • lpdwProcessId [out,optional]

  • 返回:DWORD

这是一个函数,它将窗口的句柄和指针作为输入。

返回时,*pointer保存hWnd所属进程的PID。 返回值是hWnd所属线程的TID。

是什么让MS工程师选择将TID作为返回值返回,并将其作为PID的参数写入地址?为什么不相反呢?返回PID并写入TID?为什么不在指向包含struct {TID,PID}的结构的指针中返回?

是什么决定了这些选择?它背后有逻辑吗?

1 个答案:

答案 0 :(得分:2)

Windows由线程拥有,线程由进程拥有。

如果您只想要线程ID,则不希望浪费任何时间获取进程ID。如果你想要进程ID,你将不得不首先获得线程ID。

这直接映射到GetWindowThreadProcessId API:

  • 如果您需要的只是线程ID,您可以要求它而不是支付查找进程ID的成本(通过将lpdwProcessId设置为null)。
  • 如果你需要进程ID,那么获取线程ID也没什么坏处,因为这是必要的中间步骤。

所以我希望这能解释为什么返回 TID并通过指针间接存储PID(而不是相反)。这也应该清楚为什么它不返回具有两个值的结构。

为什么没有两个单独的函数:GetWindowThreadID和GetThreadIDProcessID?如果您需要线程ID,则调用第一个,如果需要进程ID,则同时调用它们。我的猜测是GetWindowThreadProcessId可以比你必须做的更有效率地做第二步。