Ошибка QueryFullProcessImageName с допустимым HINSTANCE? - PullRequest
2 голосов
/ 26 марта 2009
//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 действительны ...

Спасибо

1 Ответ

5 голосов
/ 26 марта 2009

Основная проблема:

Для функции: QueryFullProcessImageName , первый параметр не HINSTANCE, это дескриптор процесса. Они разные. Чтобы получить текущий идентификатор процесса, вы должны использовать 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 () и найти здесь его возвращаемое значение .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...