【问题标题】:Return convention in windowsWindows中的返回约定
【发布时间】:2017-11-13 00:28:20
【问题描述】:

我遇到了这个功能:

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

GetWindowThreadProcessId:

  • hWnd [in](窗口把手)

  • lpdwProcessId [输出,可选]

  • 返回:DWORD

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

当它返回时,*pointer 保存了 hWnd 所属进程的 PID。 返回值为hWnd所属线程的TID。

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

是什么支配了这些选择?这背后有逻辑吗?

【问题讨论】:

  • 对这个问题的任何回答都是一种意见,除非做出这个决定的团队中的真正的 MS 工程师碰巧看到了帖子并回答了它。这里没有人可以推测为什么代码是由那个团队设计的。
  • 效率目的:返回结构体的效率低于返回值并修改指针传递的单个变量。函数的返回值可以直接放入寄存器,而返回的结构体不能。

标签: c windows


【解决方案1】:

窗口归线程所有,线程归进程所有。

如果您只需要线程 ID,则不想浪费任何时间获取进程 ID。如果您想要进程 ID,则必须先获取线程 ID。

这直接映射到 GetWindowThreadProcessId API:

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

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

为什么不拥有两个独立的函数:GetWindowThreadID 和 GetThreadIDProcessID?如果需要线程 ID,则调用第一个,如果需要进程 ID,则同时调用两者。我的猜测是 GetWindowThreadProcessId 可以比您必须将其作为一个单独的步骤来更有效地执行第二步。

【讨论】:

  • 我认为另一个原因是错误处理。如果函数返回结构,则很难显示失败。大多数 WinAPI 函数(或者可能全部!)返回整数或句柄,它们作为错误消息发挥双重作用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-09
  • 1970-01-01
  • 2018-08-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多