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.
我读过“如果指定的版本信息结构存在,且版本信息可用,则返回值为非零。”我可能没有足够的权利阅读这些信息吗?因为它确实存在 - 任务管理器打印它以获取进程的详细信息。调用这些函数是否依赖于除进程路径之外的任何其他函数?