gpt4 book ai didi

c++ - 获取进程标识符总是返回 0

转载 作者:行者123 更新时间:2023-11-28 04:04:57 27 4
gpt4 key购买 nike

所以这里的代码总是为我的进程标识符返回 0。

::std::uint32_t GetPID(const char* windowName)
{
::std::uint32_t pID; // when this is initialized to 0, my function returns 0 otherwise it returns rand

HWND hWindow = FindWindow(NULL, (LPCWSTR)windowName);

GetWindowThreadProcessId(hWindow, &pID);

return pID;
}

我尝试过使用我的其他函数来获取进程标识符,它之前对我来说工作得很好,但它也返回了 0。我也尝试过使用其他进程名称,但没有任何效果。

我尝试调试它,我看到当我将 pID 初始化为 0 时,该函数返回 0。我认为这是因为 FindWindow() 的 HWND 不知何故无效,因此 GetWindowThreadProcessId() 不会将我的 pID 变量设置为进程 ID,因此它保持为 0。此外,当我刚刚定义 pID,我的函数返回不是 pid 的随机数(垃圾内存,因为它没有初始化,就好像来自 FindWindow() 的句柄无效,因此没有进程标识符分配给我的变量 pIDGetWindowThreadProcessId())。

我认为它与 FindWindow() 函数有关,但我尝试将其他进程名称放入其中,但没有任何变化。我可以使用 PROCESSENTRY32,但我想知道这有什么问题。

我觉得答案就在我面前,但不知为何我想不通。

最佳答案

采用字符串参数的旧 Windows API 函数有三种变体,一种采用窄字符串 (char),一种采用宽字符串 (wchar_t),另一种采用窄字符串或宽字符串,具体取决于 UNICODE。宏设置 ( tchar_t )。

总是采用窄字符串的函数可以用 A 来标识在函数名称的末尾,那些总是采用 W 的宽字符串.

最近的 API 函数可能根本不提供窄 (ANSI) 版本,在这种情况下,上述内容不适用。 FindWindow然而,这不是其中之一。

您正在使用具有变量类型的变体,显然是 UNICODE设置已为您更改,因为您说该代码以前有效。但是我确定您添加了 (LPCWSTR)稍后再转换,因为在任何一种情况下转换都是错误的。

(LPCWSTR)windowName类型转换 const char*指向 const wchar_t* 的指针指针( LPCWSTRconst wchar_t* ),但它实际上并没有将指针指向的窄字符转换为宽字符。例如,在 Windows 上,宽字符是两个字节宽,因此 windowName 的数组的每两个字节。当函数取消引用指针时,指向将被解释为一个字符。但这显然没有意义。特别是空终止符在 char 中只有一个字节。 , 但在 wchar_t 中需要两个字节.因此,char 极不可能windowName 的数组指向将包含一个正确对齐的空终止符 wchar_t* , 当函数迭代 wchar_t* 时导致未定义的行为越界。

因此,您处于处理 FindWindow 的最佳情况下乱码作为窗口名称,但很可能你会有未定义的行为。

如果传递的是窄字符串,请使用适当的函数:

HWND hWindow = FindWindowA(NULL, windowName);

一般来说,永远不要使用 C 风格的转换,因为它们会做很多意想不到的事情。而是使用 static_castreinterpret_cast或任何其他合适的类型转换。单例static_cast s 通常没有问题,但一旦您需要使用 reinterpret_cast你应该非常小心它实际上在做什么。 C 风格的转换可以执行任何这些转换,因此为了格外小心隐藏了这一要求。


您还应该始终检查 API 调用的结果是否有错误并正确处理它们。那很可能会向您表明 FindWindow 有问题。调用(即使调用中已经存在未定义的行为)。这也是必要的,因为您可能无法保证在对 GetPID 的所有调用中实际上都能找到一个窗口。然后是 HWND返回的不是有效的窗口句柄:

HWND hWindow = FindWindowA(NULL, windowName);

if(!hWindow) {
// handle error
}

关于c++ - 获取进程标识符总是返回 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58897001/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com