【发布时间】:2019-06-25 14:30:26
【问题描述】:
我想获取 Windows 的完整版本号,就像 CMD 一样:
我最终得到了这个MS doc,上面写着:
要获取操作系统的完整版本号,请调用 系统 DLL 之一上的 GetFileVersionInfo 函数,例如 Kernel32.dll,然后调用 VerQueryValue 获取 \StringFileInfo\\ProductVersion 文件版本的子块 信息。
所以我尝试在这段代码中使用这些函数:
#include <Windows.h>
#include <wchar.h>
#pragma comment(lib, "Mincore.lib")
int wmain(int argc, wchar_t* argv[])
{
// GetFileVersionInfoW
LPCWSTR fileName = L"C:\\Windows\\System32\\kernel32.dll";
DWORD fileInfoSize;
fileInfoSize = GetFileVersionInfoSizeW(fileName, NULL);
if (fileInfoSize == 0)
{
fwprintf(stderr, L"\nError code: %u\n", GetLastError());
return;
}
// GetFileVersionInfoW
VOID* pFileVerInfo = malloc(fileInfoSize);
if (pFileVerInfo == NULL)
{
fwprintf(stderr, L"Failed allocating!\n");
return;
}
if (!GetFileVersionInfoW(fileName, 0, fileInfoSize, pFileVerInfo))
{
fwprintf(stderr, L"Error code: %u\n", GetLastError());
free(pFileVerInfo);
return;
}
// VerQueryValueW
LPCWSTR subBlock = L"\\StringFileInfo\\\\ProductVersion";
VS_FIXEDFILEINFO * pFileInfo;
UINT pLen = 0;
if (!VerQueryValueW(pFileVerInfo, subBlock, (LPVOID*)& pFileInfo, &pLen))
{
fwprintf(stderr, L"Error code: %u\n", GetLastError());
return;
}
return 0;
}
但是,VerQueryValueW 函数失败,代码为 1813,我不知道为什么。我也不知道如何在调用函数后显示完整版本。
你能帮帮我吗?
【问题讨论】:
-
尝试为不同的失败案例输出不同的文本......你无法分辨是
GetFileVersionInfoSizeW失败了,还是GetFileVersionInfoW,还是VerQueryValueW -
嗯...我在 Visual Studio 中设置了一些断点,结果发现是
VerQueryValueW失败了。 -
return;在返回int的函数中是非法的 -
你应该看看this question instead 而不是跳槽。