Как я могу получить версию моего запущенного приложения?
я использовал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
из меня, а не через сеть?