使用 GetFileVersionInfo API (C++) 以编程方式获取 .exe 的 ProductVersion
Programmatically get the ProductVersion of .exe using GetFileVersionInfo API (C++)
引用此answer I'm trying to get ProductVersion with windows Api using GetFileVersionInfo方法。问题是通过 .exe ProductVersion 的属性是可见的,但以编程方式我只得到“0.0.0.0”。
.exe 属性:
输出:
代码:
printf( "File Version 1: %d.%d.%d.%d\n",
( verInfo->dwFileVersionMS >> 16 ) & 0xffff,
( verInfo->dwFileVersionMS >> 0 ) & 0xffff,
( verInfo->dwFileVersionLS >> 16 ) & 0xffff,
( verInfo->dwFileVersionLS >> 0 ) & 0xffff
);
printf( "File Version 2: %d.%d.%d.%d\n",
( verInfo->dwFileVersionLS >> 24 ) & 0xff,
( verInfo->dwFileVersionLS >> 16 ) & 0xff,
( verInfo->dwFileVersionLS >> 8 ) & 0xff,
( verInfo->dwFileVersionLS >> 0 ) & 0xff
);
printf( "Product Version 1: %d.%d.%d.%d\n",
( verInfo->dwProductVersionLS >> 24 ) & 0xff,
( verInfo->dwProductVersionLS >> 16 ) & 0xff,
( verInfo->dwProductVersionLS >> 8 ) & 0xff,
( verInfo->dwProductVersionLS >> 0 ) & 0xff
);
printf( "Product Version 2: %d.%d.%d.%d\n",
(verInfo->dwProductVersionMS >> 16) & 0xffff,
(verInfo->dwProductVersionMS >> 0) & 0xffff,
(verInfo->dwProductVersionLS >> 16) & 0xffff,
(verInfo->dwProductVersionLS >> 0) & 0xffff
);
printf( "Product Version 3: %d.%d.%d.%d\n",
(verInfo->dwProductVersionMS >> 16) & 0xffff,
(verInfo->dwProductVersionMS >> 8) & 0xffff,
(verInfo->dwProductVersionLS >> 16) & 0xffff,
(verInfo->dwProductVersionLS >> 8) & 0xffff
);
问题是 - WTF?如何获取 ProductVersion,微软的人是怎么做到的?
版本信息资源包含一个小的固定部分 (VS_FIXEDFILEINFO
) 和一些可选的字符串。
有些应用程序显示固定部分的数字,有些应用程序使用 FileVersion/ProductVersion 字符串。
如果存在该字符串,您可能应该使用它,因为它允许开发人员添加额外的信息,如 Alpha/Beta 等,并且因为有些人忘记在固定部分正确设置正确的版本。
使用 VerQueryValue
函数获取语言列表和字符串...
下面是代码片段,供那些也尝试获取 ProductVersion 的人使用:
if (!VerQueryValue (lpData, TEXT("\StringFileInfo\040904E4\ProductVersion"),
(LPVOID) &lpBuffer, (PUINT) &BufLen)) {
/* language ID 040904E4: U.S. English, char set = Windows, Multilingual */
printf ("ProductVersion: not found\n");
}
else
printf ("ProductVersion: %s\n", lpBuffer);
这里是Full Code.
这对我有用
fwprintf(f_output, L"// File Version:\t\t\t%d.%d.%d.%d\n",
(verInfo->dwFileVersionMS >> 16) & 0xffff,
(verInfo->dwFileVersionMS >> 0) & 0xffff,
(verInfo->dwFileVersionLS >> 16) & 0xffff,
(verInfo->dwFileVersionLS >> 0) & 0xffff
);
fwprintf(f_output, L"// Product Version:\t\t\t%d.%d.%d.%d\n",
(verInfo->dwProductVersionMS >> 16) & 0xffff,
(verInfo->dwProductVersionMS >> 0) & 0xffff,
(verInfo->dwProductVersionLS >> 16) & 0xffff,
(verInfo->dwProductVersionLS >> 0) & 0xffff
);
引用此answer I'm trying to get ProductVersion with windows Api using GetFileVersionInfo方法。问题是通过 .exe ProductVersion 的属性是可见的,但以编程方式我只得到“0.0.0.0”。
.exe 属性:
输出:
代码:
printf( "File Version 1: %d.%d.%d.%d\n",
( verInfo->dwFileVersionMS >> 16 ) & 0xffff,
( verInfo->dwFileVersionMS >> 0 ) & 0xffff,
( verInfo->dwFileVersionLS >> 16 ) & 0xffff,
( verInfo->dwFileVersionLS >> 0 ) & 0xffff
);
printf( "File Version 2: %d.%d.%d.%d\n",
( verInfo->dwFileVersionLS >> 24 ) & 0xff,
( verInfo->dwFileVersionLS >> 16 ) & 0xff,
( verInfo->dwFileVersionLS >> 8 ) & 0xff,
( verInfo->dwFileVersionLS >> 0 ) & 0xff
);
printf( "Product Version 1: %d.%d.%d.%d\n",
( verInfo->dwProductVersionLS >> 24 ) & 0xff,
( verInfo->dwProductVersionLS >> 16 ) & 0xff,
( verInfo->dwProductVersionLS >> 8 ) & 0xff,
( verInfo->dwProductVersionLS >> 0 ) & 0xff
);
printf( "Product Version 2: %d.%d.%d.%d\n",
(verInfo->dwProductVersionMS >> 16) & 0xffff,
(verInfo->dwProductVersionMS >> 0) & 0xffff,
(verInfo->dwProductVersionLS >> 16) & 0xffff,
(verInfo->dwProductVersionLS >> 0) & 0xffff
);
printf( "Product Version 3: %d.%d.%d.%d\n",
(verInfo->dwProductVersionMS >> 16) & 0xffff,
(verInfo->dwProductVersionMS >> 8) & 0xffff,
(verInfo->dwProductVersionLS >> 16) & 0xffff,
(verInfo->dwProductVersionLS >> 8) & 0xffff
);
问题是 - WTF?如何获取 ProductVersion,微软的人是怎么做到的?
版本信息资源包含一个小的固定部分 (VS_FIXEDFILEINFO
) 和一些可选的字符串。
有些应用程序显示固定部分的数字,有些应用程序使用 FileVersion/ProductVersion 字符串。
如果存在该字符串,您可能应该使用它,因为它允许开发人员添加额外的信息,如 Alpha/Beta 等,并且因为有些人忘记在固定部分正确设置正确的版本。
使用 VerQueryValue
函数获取语言列表和字符串...
下面是代码片段,供那些也尝试获取 ProductVersion 的人使用:
if (!VerQueryValue (lpData, TEXT("\StringFileInfo\040904E4\ProductVersion"),
(LPVOID) &lpBuffer, (PUINT) &BufLen)) {
/* language ID 040904E4: U.S. English, char set = Windows, Multilingual */
printf ("ProductVersion: not found\n");
}
else
printf ("ProductVersion: %s\n", lpBuffer);
这里是Full Code.
这对我有用
fwprintf(f_output, L"// File Version:\t\t\t%d.%d.%d.%d\n",
(verInfo->dwFileVersionMS >> 16) & 0xffff,
(verInfo->dwFileVersionMS >> 0) & 0xffff,
(verInfo->dwFileVersionLS >> 16) & 0xffff,
(verInfo->dwFileVersionLS >> 0) & 0xffff
);
fwprintf(f_output, L"// Product Version:\t\t\t%d.%d.%d.%d\n",
(verInfo->dwProductVersionMS >> 16) & 0xffff,
(verInfo->dwProductVersionMS >> 0) & 0xffff,
(verInfo->dwProductVersionLS >> 16) & 0xffff,
(verInfo->dwProductVersionLS >> 0) & 0xffff
);