我想在Windows中使用C ++获取进程的描述(在任务管理器中看到的描述)。
答案 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