12

実行時にリソース ファイルからアプリケーションのバージョン情報を取得する簡単な方法はありますか?

私が実際にやりたいことは、ProductVersion と FileVersion と同期しなければならない別の変数をどこかに持たずに、実行時に「バージョン XYZ」を表示できるようにすることです。

明確にするために: はい、これは標準の C++ Windows プロジェクトです。私はGetFileVersionInfoメソッドを認識していますが、バージョン情報を照会するためだけにメモリ内のバージョン内からバイナリを開く必要があるのはばかげているようです - ここで明らかな何かが欠けていると確信しています:-)

4

4 に答える 4

7

OS が Windows の場合は、 関数GetFileVersionInfoVerQueryValue関数を使用します。

于 2012-09-13T11:38:20.287 に答える
5

(ファイルを開いて GetFileVersionInfo と VerQueryValue を使用するよりも) 簡単な方法があるとは思いません。役立つ場合に備えて、次のコードを使用します。

static CString GetProductVersion()
{
    CString strResult;

    char szModPath[ MAX_PATH ];
    szModPath[ 0 ] = '\0';
    GetModuleFileName( 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;
}

デビッド

于 2012-09-13T14:25:50.267 に答える
4

公式にサポートされている唯一の方法は、GetFileVersionInfo()andを使用することVerQueryValue()です。ただし、お気づきGetFileVersionInfo()のように、実行可能ファイルのファイル名を渡す必要があります。 これには理由があります。を使用して実行中のプロセスのファイル名を取得するのは簡単ですがGetModuleFileName()、特に実行可能ファイルがリモート共有から実行されている場合は、最も効率的なオプションではありません。プロセスの実行が開始されました。

を呼び出してプロセスのリソースFindResource()を見つけ、と を使用してそのデータへのポインターを取得することにより、既にメモリ内で実行されているプロセスのバージョン情報にアクセスできます。そのポインターを のパラメーターとして渡したくなりますが、そうするとコードがクラッシュする可能性があるので注意してください。リソースに直接アクセスする場合は、まったく使用しない方がよいでしょう。リソース形式は文書化されているため、生データを手動で解析できます。それほど難しくありません。RT_VERSIONLoadResource()LockResource()pBlockVerQueryValue()RT_VERSIONVerQueryValue()RT_VERSION

于 2012-09-13T21:57:54.970 に答える
1

すでに述べたように、簡単な方法はありません。

ここで素晴らしい実例を見つけることができます(ATL フリー)。

于 2015-02-05T10:45:25.267 に答える