2014-11-08 3 views
0

Я пишу приложение 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, &gti); 

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.

ответ

0

Это немного длинное чтение, но попробуйте ... this для начала.

Если вы работаете на XP или выше, рекомендуется обходной путь, чтобы получить в 64-битном пути образа процесса из 32-битного процесса, является использование более новой GetProcessImageFileName, который получает путь (через ProcessImageFileName (27) класс информации процесса NtQueryInformationProcess). Уровень wow64 на этот раз не так много, потому что это просто строка в Юникоде. Однако эта функция имеет недостаток - возвращаемый путь имеет форму/Device/HarddiskVolumeX вместо путей на основе букв в стиле DOS.

Обратите внимание, что одна ошибка пыталась сказать вам, что в ваш указатель было скопировано только 32 бита 64-разрядного адреса. В статье это лучше, чем я могу.

+0

re paths: Я заметил, что с 'GetProcessImageFileName' – XerZetZip

+0

Да, он пытается сказать вам, что он копировал только половину 64-разрядного адреса в эту 32-разрядную область хранения. Подробнее см. Ссылку на статью «это» выше. –

Смежные вопросы