如何获得流程描述?

时间:2012-08-07 09:51:59

标签: c++ windows

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

2 个答案:

答案 0 :(得分:3)

尽管我阅读了此问题,可接受的答案和VerQueryValue的文档,但我还是花了一段时间了解如何使用该VerQueryValue函数(因为docs中的代码示例没有变量的声明,对我来说一点也不清楚。)

因此,我决定将可轻松运行的代码作为使用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

答案 1 :(得分:2)

您很可能希望使用VerQueryValue api调用从程序的主.exe文件的版本资源中获取description字段。

请参阅http://msdn.microsoft.com/en-us/library/ms647464(v=vs.85).aspx