2

我想使用 C++ 在 Windows 中获取进程的描述(在任务管理器中看到的描述)。

4

2 回答 2

5

您很可能希望使用API 调用从程序FileDesription主文件的版本资源中获取该字段。以下是该文档中的一个示例:.exeVerQueryValue()

以下示例显示如何枚举可用版本语言并检索每种语言的 FileDescription 字符串值。

请务必在调用VerQueryValue之前调用GetFileVersionInfoSizeGetFileVersionInfo函数以正确初始化pBlock缓冲区。

// Structure used to store enumerated languages and code pages.

HRESULT hr;

struct LANGANDCODEPAGE {
  WORD wLanguage;
  WORD wCodePage;
} *lpTranslate;

// Read the list of languages and code pages.

VerQueryValue(pBlock, 
              TEXT("\\VarFileInfo\\Translation"),
              (LPVOID*)&lpTranslate,
              &cbTranslate);

// Read the file description for each language and code page.

for( i=0; i < (cbTranslate/sizeof(struct LANGANDCODEPAGE)); i++ )
{
  hr = StringCchPrintf(SubBlock, 50,
            TEXT("\\StringFileInfo\\%04x%04x\\FileDescription"),
            lpTranslate[i].wLanguage,
            lpTranslate[i].wCodePage);
  if (FAILED(hr))
  {
  // TODO: write error handler.
  }

  // Retrieve file description for language and code page "i". 
  VerQueryValue(pBlock, 
                SubBlock, 
                &lpBuffer, 
                &dwBytes); 
}
于 2012-08-07T10:01:12.037 回答
3

虽然我阅读了这个问题、接受的答案和 的文档VerQueryValue,但我花了很长时间来了解如何使用该VerQueryValue函数(因为文档中的代码示例没有变量声明,对我来说根本不清楚) .

因此,我决定将可以轻松运行的代码放在这里,作为VerQueryValue获取流程描述的使用示例。

#pragma comment(lib,"Version.lib")

#include <iostream>
#include <windows.h>
#include <winver.h>

using namespace std;

int printFileDescriptions(const wchar_t* filename)
{
    int versionInfoSize = GetFileVersionInfoSize(filename, NULL);
    if (!versionInfoSize) {
        return 0;
    }

    auto versionInfo = new BYTE[versionInfoSize];
    std::unique_ptr<BYTE[]> versionInfo_automatic_cleanup(versionInfo);
    if (!GetFileVersionInfo(filename, NULL, versionInfoSize, versionInfo)) {
        return 0;
    }

    struct LANGANDCODEPAGE {
        WORD wLanguage;
        WORD wCodePage;
    } *translationArray;

    UINT translationArrayByteLength = 0;
    if (!VerQueryValue(versionInfo, L"\\VarFileInfo\\Translation", (LPVOID*)&translationArray, &translationArrayByteLength)) {
        return 0;
    }

    // You may check GetSystemDefaultUILanguage() == translationArray[i].wLanguage 
    // if only the system language required
    for (unsigned int i = 0; i < (translationArrayByteLength / sizeof(LANGANDCODEPAGE)); i++) {
        wchar_t fileDescriptionKey[256]; 
        wsprintf(
            fileDescriptionKey,
            L"\\StringFileInfo\\%04x%04x\\FileDescription",
            translationArray[i].wLanguage,
            translationArray[i].wCodePage
        );

        wchar_t* fileDescription = NULL;
        UINT fileDescriptionSize;
        if (VerQueryValue(versionInfo, fileDescriptionKey, (LPVOID*)&fileDescription, &fileDescriptionSize)) {
            wcout << endl << fileDescription << endl;
        }
    }

    return TRUE;
}

int main()
{
    // Set locale of the console to print non-ASCII symbols
    SetConsoleOutputCP(GetACP());
    SetConsoleCP(GetACP());
    wcout.imbue(std::locale("")); // set default global locale
    // ----------------------------------------------------

    auto path = L"C:\\Windows\\explorer.exe";
    printFileDescriptions(path);

    wcin.get(); // to prevent console close
}

假设你系统上的所有WinAPI函数都使用wchar_t了,也VerQueryValueW就是实际使用了。

我在此处获取的代码的初始版本Retrieve File Description an Application VerQueryValue

于 2020-05-10T11:53:28.917 回答