//////////////////////////////////////////////////////////// // Модуль для получения инфы о версии // // файла из его ресурса // // v 1.1 // // // // Copyright (C) 2007 Sagrer // // Распространяется на условиях LGPL 2.1 // // см. файл lgpl.txt // // // // sagrer@yandex.ru // //////////////////////////////////////////////////////////// //К работе над данным файлом приложили руки, ноги.... короче аффтары: // 1) Sagrer (sagrer@yandex.ru) //////////////////////////////////////////////////////////////////////// unit KOLVersionInfo; interface uses Windows, messages, KOL; type TVerInfoFromFile = class CompanyName : string; FileDescription : string; FileVersion : string; InternalName : string; LegalCopyright : string; OriginalFilename : string; ProductName : string; ProductVersion : string; Comments : string; CraftedBy : string; Function LoadInfo(const FileName : string) : boolean; Function GetValue(const Value : string): string; private BuffSize : Cardinal; Dummy : Cardinal; Buffer : pointer; LangInfa : pointer; Int1 : integer; LangCharSet, LangInfoStr : string; end; implementation Function TVerInfoFromFile.LoadInfo(const FileName : string) : boolean; begin //Собсно функа для загрузки инфы из файла. //Получить размер блока с инфой о версии в файле. BuffSize := GetFileVersionInfoSize(PChar(FileName),Dummy); //MsgOK(Int2Str(BuffSize)); //Для отладки. Buffer := AllocMem(BuffSize); //Выделить нужное количество памяти, запомнить пойнтер. //И прочитать сам блок с инфой в буфер по пойнтеру. GetFileVersionInfo(pchar(FileName),Dummy,BuffSize,Buffer); //Получить инфу о языке инфы о версии... VerQueryValue(Buffer,'\VarFileInfo\Translation',LangInfa,Dummy); If Dummy >= 4 then begin Int1 := 0; //В этот интегер будут писаться числа для перевода их в текст в виде HEX. StrLCopy(@Int1, pchar(LangInfa), 2); //Скопировать первые 2 байта из LangInfa в Int1 LangCharSet := Int2Hex(Int1,4); //Впихнуть в строку HEX :) StrLCopy(@Int1,pchar(LangInfa)+2,2); //Скопировать 2-е 2 байта. LangInfoStr := LangCharSet+Int2Hex(Int1,4); end; //Ну а теперь можно залоадить всю необходимую инфу :). CompanyName := GetValue('CompanyName'); FileDescription := GetValue('FileDescription'); FileVersion := GetValue('FileVersion'); InternalName := GetValue('InternalName'); LegalCopyright := GetValue('LegalCopyright'); OriginalFilename := GetValue('OriginalFilename'); ProductName := GetValue('ProductName'); ProductVersion := GetValue('ProductVersion'); Comments := GetValue('Comments'); CraftedBy := GetValue('CraftedBy'); //Ну типа все готово, ок. Result := true; end; Function TVerInfoFromFile.GetValue(const Value : string): string; var TempStr : PChar; begin //Функа уже получает конкретное значение :). //Работает только после LoadInfo, когда инфа уже загружена в //переменные. Ну и в самой LoadInfo используется как только //это становится возможным... VerQueryValue(Buffer,pchar('\StringFileInfo\'+LangInfoStr+'\'+Value),pointer(TempStr),Dummy); if Dummy > 0 then begin //Функа чегото вернула. Вернуть то что вернула :) Result := TempStr; end else begin //Нифига не вернула - вернуть "нифига". Result := 'n/a'; end; end; end.