How to get process description?

后端 未结 2 383
既然无缘
既然无缘 2020-12-21 17:57

I want to get the description of a process (the description that is seen in task manager) in Windows using C++.

2条回答
  •  星月不相逢
    2020-12-21 18:32

    Although I read this question, the accepted answer, and the documentation for VerQueryValue, I spent quite a while to understand how to use that VerQueryValue function (since the code example in the docs has no declarations of variables and isn't clear for me at all).

    So I decided to put here the code that can be easily run as a working example of the usage of VerQueryValue to get a process description.

    #pragma comment(lib,"Version.lib")
    
    #include 
    #include 
    #include 
    
    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 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
    }
    
    

    It's supposed that all WinAPI functions on your system use wchar_t, that is VerQueryValueW is actually used.

    The initial version of the code I took here Retrieve File Description an Application VerQueryValue

提交回复
热议问题