从 C++ 中的可执行路径(或从 hWnd,或从 pid)获取程序名称
Posted
技术标签:
【中文标题】从 C++ 中的可执行路径(或从 hWnd,或从 pid)获取程序名称【英文标题】:Get program name from executable path (or from hWnd, or from pid) in C++ 【发布时间】:2011-06-28 16:56:14 【问题描述】: 我有一个窗口的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。
我读过“如果指定的版本信息结构存在,并且版本信息可用,则返回值非零。”是否有可能我没有足够的权限来阅读该信息?因为它确实存在 - 任务管理器打印它以获取进程的详细信息。调用这些函数是否依赖于进程路径以外的任何其他内容?
【问题讨论】:
检查***.com/questions/2789017/… @Gabriel:您的评论就是答案...链接到 Jerry Coffin 的出色答案。为什么不把它写成答案?或者,这是一个我们应该投票结束的情况,因为它是如此相似/相同? 谢谢,我看过那个帖子,但是 GetFileVersionInfo 和 VerQueryValue 似乎返回了一个 VS_FIXEDFILEINFO 类型的结构,它没有提供我需要的信息(“文件描述”,我相信)。 @loanna - msdn.microsoft.com/en-us/library/ms647464(v=vs.85).aspx 【参考方案1】:在这里,作为答案:)
How to get information about a Windows executable (.exe) using C++
【讨论】:
【参考方案2】:您可以使用GetWindowText。
【讨论】:
以上是关于从 C++ 中的可执行路径(或从 hWnd,或从 pid)获取程序名称的主要内容,如果未能解决你的问题,请参考以下文章
使用 Querybuilder 从全文搜索父路径中排除子路径或从 XPATH/JCR SQL2 查询中获取搜索命中摘录
docker从容器里面拷文件到宿主机或从宿主机拷文件到docker容器里面