从C ++中的可执行路径(或从hWnd或从pid)获取程序名称

时间:2011-06-28 16:56:14

标签: c++ winapi process

  • 我有一个窗口的 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.

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

2 个答案:

答案 0 :(得分:3)

答案 1 :(得分:1)

您可以使用GetWindowText