実行中のアプリケーションのバージョンを取得するにはどうすればよいですか?
私は使用していますGetFileVersionInfo(ParamStr(0), ...)
:
filename := PChar(ExtractShortPathName(ParamStr(0)));
//Get the number of bytes he have to allocate for the file information structure
dwInfoLength := GetFileVersionInfoSize(lptstrFilename, {var}dwHandle);
//Get version info
GetMem(pInfoData, dwInfoLength);
GetFileVersionInfo(lptstrFilename, dwHandle, dwInfoLength, pInfoData);
//Set what information we want to extract from pInfoData
lpSubBlock := PChar(Chr(92)+Chr(0));
//Extract the desired data from pInfoData into the FileInformation structure
VerQueryValue(pInfoData, lpSubBlock, PFileInformation, LengthOfReturned);
この手法の問題点は、リソースを読み取る前に Windows ローダーがイメージをロードする必要があることです。IMAGE_FILE_NET_RUN_FROM_SWAP
イメージフラグを使用してアプリケーションをビルドします(面倒なネットワークでページ内例外を回避するため)。
これにより、Windows ローダーは、単に"me"を見るのではなく、ネットワークを介してイメージ全体を再度ロードします。起動時に自分のバージョンをチェックして保存するので、6 秒のアプリケーション起動が 10 秒のアプリケーション起動に変わります。
実行中のアプリケーションであるmeのバージョンを読み取るにはどうすればよいですか?
Windows には実行中のプロセスのバージョンを読み取るための API がなく、ロードしたファイルのみが含まれていると想定します (ファイルが存在しなくなった場合、バージョン情報を読み取ることはできません)。
しかし、プロセス自体のメモリからバージョン リソースを読み取ることも可能だと思います (もちろん、管理者またはデバッガー グループのメンバーでなくても)。
プロセスのバージョンを読み取ることはできますか?
関連ボーナスの質問:ネットワーク経由ではなく、自分PE Image
からリソースをロードするにはどうすればよいですか?