c - QueryFullProcessImageName 因有效 HINSTANCE 失败?

标签 c winapi

//window is an HWND
LPWSTR path = new WCHAR[1024];
DWORD  size = 1024;

GetWindowText(window, path, 1024);

HINSTANCE instance = (HINSTANCE)GetWindowLongPtr(window, GWLP_HINSTANCE);

QueryFullProcessImageName(instance, PROCESS_NAME_NATIVE, path, &size);

此代码在调用 QueryFullProcessImageName(...) 时失败,错误代码为 6 [无效句柄]。 GetWindowText 成功,并且 GetWindowLong 返回非零 HINSTANCE。

我对 win32 还很陌生,所以我不明白为什么这不起作用。我相信涉及的 HWND 和 HINSTANCE 都是有效的......

谢谢

最佳答案

主要问题:

对于函数:QueryFullProcessImageName ,第一个参数不是 HINSTANCE,它是进程句柄。他们是不同的。要获取当前进程 ID,您应该使用 GetCurrentProcessId 。然后将其传递到 OpenProcess获取进程句柄。


其他问题:

您应该使用GetWindowLongPtr上面而不是 GetWindowLong。在 x64 系统上使用 GetWindowLong 可能会导致问题。


如何自行找出问题所在:

大多数Win32函数失败后,可以使用GetLastError找出原因。

因此,在调用 QueryFullProcessImageName 后,请执行以下操作:

DWORD dwLastError = GetLastError();
LPVOID lpMsgBuf;
std::string strErrorMessage;
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, dwLastError, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpMsgBuf,    0, NULL);
if (lpMsgBuf)
{
    strErrorMessage = (const TCHAR*)lpMsgBuf;
    LocalFree(lpMsgBuf);
}

您也可以简单地调用 GetLastError() 和 lookup its return value here .

关于c - QueryFullProcessImageName 因有效 HINSTANCE 失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/687001/

相关文章:

c - fcntl,lockf,哪个更好用于文件锁定?

c - 重新编译相同的代码会在 VC++ 中生成不同的可执行文件

c - 使用套接字的 lpNumberOfBytesRead 和 lpNumberOfBytesWritten

c++ - 非 MFC CalcWindowRect()?

c - 如何在 printf 语句中预递增

比较字符数组的地址

c - 具有双向链表插入的优先级队列

windows - 如何在 Win32 中自定义选项卡控件的外观?

c++ - ListView控件中的LVN_ITEMCHANGED优化

c++ - 如何区分外接显示器和笔记本屏幕本身?