Я пишу приложение Windows (MS), чтобы получить имя процесса активного окна.Поведение приложения различается на разностных машинах и операционных системах
На настольном ПК под управлением 32-разрядного Windows XP Professional приложение работает как ожидалось. Но на ноутбуке с 64-разрядной ОС Windows 7 Professional работает не так, как ожидалось. Для определенных процессов возвращается недопустимый дескриптор. Я получаю те же результаты на ультрабуке с 64-разрядной версией Windows 8.1.
Соответствующий фрагмент кода выглядит следующим образом:
DWORD dwThreadID, dwProcessID;
GUITHREADINFO gti;
HANDLE hProcess;
char szProcessFileName[MAX_PATH] = {0};
gti.cbSize = sizeof(GUITHREADINFO);
GetGUIThreadInfo(0, >i);
dwThreadID = GetWindowThreadProcessId(gti.hwndActive, &dwProcessID);
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, dwProcessID);
// Get the name of the process (no error checking for brevity)
GetModuleFileNameEx(hProcess, NULL, szProcessFileName, MAX_PATH);
Когда приложение работает в не-Windows XP операционки, как указано выше, для некоторых процессов OpenProcess
и GetModuleFileNameEx
неудачу. GetModuleFileNameEx
обычно завершается с (код ошибки: 299) ERROR_PARTIAL_COPY или ERROR_INVALID_PARAMETER (код ошибки: 87), тогда как OpenProcess
терпит неудачу с ERROR_INVALID_HANDLE (код ошибки: 6)
Не уверен, что происходит. Любая помощь приветствуется. Интересно, связано ли это с разрешениями пользователей.
Исходный код скомпилирован как 32-разрядное приложение на 64-разрядной машине под управлением Windows 7 Pro x64.
re paths: Я заметил, что с 'GetProcessImageFileName' – XerZetZip
Да, он пытается сказать вам, что он копировал только половину 64-разрядного адреса в эту 32-разрядную область хранения. Подробнее см. Ссылку на статью «это» выше. –