//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都是有效的......
由于
答案 0 :(得分:5)
主要问题:
对于函数:QueryFullProcessImageName,第一个参数不是HINSTANCE,它是进程句柄。它们是不同的。要获取当前进程ID,您应该使用GetCurrentProcessId。然后将其传递到OpenProcess以获取进程句柄。
其他问题:
您应该使用上面的GetWindowLongPtr而不是GetWindowLong。使用GetWindowLong可能会在x64系统上引起问题。
如何找出问题所在:
在大多数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。