//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/