从 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 【问题描述】: 我有一个窗口的HWNDGetWindowThreadProcessId 我明白了 它的进程的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)获取程序名称的主要内容,如果未能解决你的问题,请参考以下文章

Docker从容器拷贝文件到宿主机或从宿主机拷贝文件到容器

使用 Querybuilder 从全文搜索父路径中排除子路径或从 XPATH/JCR SQL2 查询中获取搜索命中摘录

docker从容器里面拷文件到宿主机或从宿主机拷文件到docker容器里面

docker从容器里面拷文件到宿主机或从宿主机拷文件到docker容器里面

异步执行 SQL 或从触发器更改锁定

从 C++ 如何执行 C 中的方法或访问结构?