使用 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
    );