- У меня есть HWND окна,
- с
GetWindowThreadProcessId
я получаю pid его процесса, - и с помощью
GetModuleFileNameEx
я получаю путь к исполняемому файлу (я использую PathFindFileName
, чтобы получить имя исполняемого файла ).
Однако я могуКажется, что не найти способ (если есть), чтобы получить имя программы.Например, для исполняемого файла chrome.exe мне бы хотелось получить имя «Google Chrome».
Не могли бы вы мне помочь?
Редактировать:
Спасибо вам всем!Используя рекомендации, которые вы рекомендовали, я пришел к следующему:
CString csProductName;
DWORD cbFileVersionInfo = GetFileVersionInfoSize(pszProcessPath, NULL);
if (cbFileVersionInfo)
{
BYTE *fileVersionInfo = new BYTE[cbFileVersionInfo];
TCHAR *pszFileDesc = NULL;
DWORD cchFileDesc;
if (GetFileVersionInfo(pszProcessPath, 0, cbFileVersionInfo, fileVersionInfo))
{
CString csFileDescSubBlock;
csFileDescSubBlock.Format(L"\\StringFileInfo\\040904E4\\ProductName");
DWORD cbLanguageInfoSize = VerQueryValue(fileVersionInfo,
csFileDescSubBlock.GetString(),
(LPVOID*)&pszFileDesc,
(PUINT)&cchFileDesc);
}
csProductName = pszFileDesc;
delete[] fileVersionInfo;
}
..., который работает как ожидалось ... но только для приложения, вызывающего его,Если имя исполняемого файла является другим, оно возвращает null, а cchFileDesc имеет значение 0.
Я прочитал, что "Если указанная структура информации о версии существует, и информация о версии доступна , возвращаемое значение отлично от нуля. "Возможно ли, что у меня недостаточно прав для чтения этой информации?Поскольку он действительно существует - диспетчер задач печатает его для деталей процесса.Зависит ли вызов этих функций от чего-либо еще, кроме пути процесса?