2

参考这个答案,我正在尝试使用GetFileVersionInfo方法通过 Windows Api 获取 ProductVersion。问题是通过 .exe ProductVersion 的属性是可见的,但以编程方式我只得到“0.0.0.0”。

.exe 属性:

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,微软的人是如何做到的?

4

3 回答 3

2

这对我有用

   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
    );
于 2021-12-17T15:22:48.623 回答
1

版本信息资源包含一个小的固定部分 ( VS_FIXEDFILEINFO) 和一些可选的字符串。

一些应用程序显示来自固定部分的数字,而一些应用程序使用 FileVersion/ProductVersion 字符串。

如果字符串存在,您可能应该使用它,因为它允许开发人员添加额外的信息,如 Alpha/Beta 等,并且因为有些人忘记在固定部分正确设置正确的版本。

使用该VerQueryValue函数获取语言列表和字符串...

于 2017-08-04T12:01:25.760 回答
0

以下是那些也试图获得 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);

这是完整代码

于 2017-08-08T11:38:13.303 回答