从应用程序中获取应用程序版本

有没有一种简单的方法在运行时从资源文件中获取应用程序版本信息?

实际上,我希望能够在运行时显示“版本XYZ”,而不必在单独的variables某处保留与我的ProductVersion和FileVersion同步的variables。

澄清:是的,这是一个标准的C ++ Windows项目。 我知道的GetFileVersionInfo方法,但它似乎很难从内存中的版本打开二进制只是为了查询版本信息 – 我敢肯定我失去了一些明显的东西:-)

如果操作系统是Windows,请使用GetFileVersionInfoVerQueryValue函数。

我不相信有一个更简单的方法(比打开文件,并使用GetFileVersionInfo和VerQueryValue)。 我使用下面的代码,以防万一它有帮助:

 static CString GetProductVersion() { CString strResult; char szModPath[ MAX_PATH ]; szModPath[ 0 ] = '\0'; GetmoduleeFileName( NULL, szModPath, sizeof(szModPath) ); DWORD dwHandle; DWORD dwSize = GetFileVersionInfoSize( szModPath, &dwHandle ); if( dwSize > 0 ) { BYTE* pbBuf = static_cast<BYTE*>( alloca( dwSize ) ); if( GetFileVersionInfo( szModPath, dwHandle, dwSize, pbBuf ) ) { UINT uiSize; BYTE* lpb; if( VerQueryValue( pbBuf, "\\VarFileInfo\\Translation", (void**)&lpb, &uiSize ) ) { WORD* lpw = (WORD*)lpb; CString strQuery; strQuery.Format( "\\StringFileInfo\\%04x%04x\\ProductVersion", lpw[ 0 ], lpw[ 1 ] ); if( VerQueryValue( pbBuf, const_cast<LPSTR>( (LPCSTR)strQuery ), (void**)&lpb, &uiSize ) && uiSize > 0 ) { strResult = (LPCSTR)lpb; } } } } return strResult; } 

大卫

唯一正式支持的方法是使用GetFileVersionInfo()VerQueryValue() 。 但是,正如您已经注意到的, GetFileVersionInfo()要求您传递可执行文件的文件名。 这是有原因的 。 尽管使用GetmoduleeFileName()获取正在运行的进程的文件名非常简单,但它并不是最有效的选项,尤其是在可执行文件从远程共享中运行的情况下,如果可执行文件已被修改,甚至不能保证是准确的进程开始运行后的硬盘。

通过调用FindResource()来查找进程的RT_VERSION资源,然后使用LoadResource()LockResource()来获取指向其数据的指针,可以访问已经在内存中运行的进程的版本信息。 然后将这个指针作为VerQueryValue()pBlock参数传递,但是要小心,因为这样做会导致代码崩溃 ! 如果直接访问RT_VERSION资源,那么最好不要使用VerQueryValue()RT_VERSION资源的格式被记录,所以你可以手动解析原始数据,这不是很困难。

正如已经说过的那样,没有简单的方法。

你可以在这里找到一个伟大的工作例子(免费的ATL)。