1

このクラスをダウンロードしましたhttp://www.codeproject.com/file/VersionInfo.asp

現在実行しているいくつかのプログラムからファイル情報を取得するために使用します。

自分が書いたプログラムから情報を取得したい場合は問題なく動作しますが、たとえば「chrome」や「visualstudio」のファイル情報を取得できません。

アプリケーションのproductNameを照会すると、まだ設定されていないため、「Todo:ProductName」が表示されます;)

しかし、chrome.exeのproductNameをクエリすると、「」が何も表示されません。

誰もその理由を知っていますか?

編集:私は少しデバッグしました、そして問題はここにあります。

BOOL CFileVersionInfo::Open( IN LPCTSTR lpszFileName )
{  
if( lpszFileName == NULL )
    ASSERT_RETURN( FALSE );

Close();
if( !GetVersionInfo( lpszFileName ) || !QueryVersionTrans() )
    Close();

return m_bValid;
};

「chrome.exe」が入力されている場合、GetVersionInfo(lpsz ...)は0を返します

編集2:はいchrome.exeには製品名フィールドがあります。

例:chrome.exe-ファイルの説明:Google Chrome-タイプ:アプリケーション-ファイルバージョン:23.0.1271.97-製品名:Google Chrome-製品バージョン:23.0.1271.97-著作権:.. blabla ...-サイズ:1.18MB-変更日:some_date-言語:英語-元のファイル名:chrome.exe

編集3:exeへのフルパスを取得するにはどうすればよいですか?プロセスIDを持っているだけです。現時点では、iamはすべてのプロセスをループし、私のprocessIdを検索します。

答えてくれてありがとう:-)

4

2 に答える 2

2

exeへのフルパスを取得するにはどうすればよいですか?

OpenProcess()を使用HANDLEしてプロセスを取得し、QueryFullProcessImageName()を使用して exe のフル パスを取得します。

GetLastError()の結果を確認して、失敗の理由を特定することを忘れないでください。

于 2013-01-10T09:44:07.327 に答える
1

これは私にとってはうまくいきます

#include <windows.h>
#include <vector>
#include <string>
#pragma comment( lib, "Version.lib" )

std::string processId_2_version( int processId )
{
    HANDLE h = OpenProcess( PROCESS_QUERY_INFORMATION, FALSE, processId );
    if ( h == 0 )
    {
        return "";
    }
    char exe[ 1024 ];
    DWORD exe_size = 1024;
    QueryFullProcessImageNameA( h, 0, exe, & exe_size );
    CloseHandle( h );
    DWORD dwHandle, sz = GetFileVersionInfoSizeA( exe, & dwHandle );
    if ( 0 == sz )
    {
        return "";
    }
    std::vector< unsigned char > buf( sz );
    if ( !GetFileVersionInfoA( exe, dwHandle, sz, & buf[ 0 ] ) )
    {
        return "";
    }
    VS_FIXEDFILEINFO * pvi;
    sz = sizeof( VS_FIXEDFILEINFO );
    if ( !VerQueryValueA( & buf[ 0 ], "\\", (LPVOID*)&pvi, (unsigned int*)&sz ) )
    {
        return "";
    }
    char ver[ 142 ];
    sprintf( ver, "%d.%d.%d.%d"
            , pvi->dwProductVersionMS >> 16
            , pvi->dwFileVersionMS & 0xFFFF
            , pvi->dwFileVersionLS >> 16
            , pvi->dwFileVersionLS & 0xFFFF
            );
    return ver;
}
于 2013-01-10T10:13:37.550 に答える