English 中文(简体)
使用有效的HINSTANCE 查询完整进程映像名称失败?
原标题:
  • 时间:2009-03-26 18:25:40
  •  标签:
//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 都是有效的…

谢谢 (xiè xiè)

最佳回答

主要问题:

对于函数: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(),并在这里查找其返回值。

问题回答

暂无回答




相关问题
热门标签