我怎樣才能得到我正在運行的應用程序的版本?如何獲取正在運行的可執行文件的版本?
我一直在使用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加載器load the image before the resources can be read。我用IMAGE_FILE_NET_RUN_FROM_SWAP
圖像標誌(in order to avoid in-page exceptions on a fiddly network)構建我的應用程序。
這將導致Windows加載程序通過網絡再次整個圖像加載,而不是隻盯着「我」。由於我在啓動時檢查並保存了自己的版本,因此6秒的應用程序啓動變成10秒的應用程序啓動。
我該如何閱讀我的版本,我的正在運行應用程序?
我會假設Windows有沒有API來讀取一個正在運行的進程的版本,只是我從加載的文件(如果該文件不再存在,那麼就無法讀取任何版本信息)。
但我也認爲它可能會從我的進程自己的內存中讀取版本資源(當然不是管理員或調試器組的成員)。
我可以讀取我的過程的版本嗎?
相關獎勵題:如何從我而不是在網絡負載PE Image
資源?
事實上,這和我想的一樣:查找'VERSIONINFO'('RT_VERSION'類型)資源,然後將其提供給'VerQueryValue' API。幸運的是,它已經是Delphi代碼片段,而不是MSDN上的C++。 –
那麼這不會讓你的問題完全重複? –
@WarrenP答案是一樣的;即使問題不同。這個問題涉及「我自己的」過程,這不一定是有人想要的Delphi應用程序的版本可能需要。誰知道,微軟可能會添加一個API來獲取「我」的版本。 –