Как получить версию запущенного исполняемого файла?

Как я могу получить версию моего запущенного приложения?


я использовал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 загружает весь образ по сети снова, а не просто просматривает«меня». Поскольку я проверяю и сохраняю свою собственную версию при запуске, 6-секундный запуск приложения превращается в 10-секундный запуск приложения.

Как узнать версию меня, моегоработающего приложения?


Я бы предположил, что у Windows нет API для чтения версии запущенного процесса, только файл, из которого я загрузился (и если файл больше не существует, то он не может прочитать информацию о версии).

Но я также предполагаю, что может быть возможно прочитать ресурсы версии из собственной памяти моих процессов (конечно, не будучи членом группы администраторов или отладчиков).

Могу ли я прочитать версию моегопроцесса?


Связанный дополнительный вопрос: Как я могу загрузить ресурсы PE Imageиз меня, а не через сеть?

5
задан Community 23 May 2017 в 11:59
поделиться