Предлагаю вариант кода, позволяющий быстро и просто узнать версию своей программы.
Обычно используют общий код, для извлечения версии, пробега по полям и т.д... Но, если нужно узнать номер версии своей программы, то всё гораздо проще.
Версия программы хранится в ресурсах. VERSIONINFO своей программы можно извлечь из ресурса с именем '#1'. В данном ресурсе версия программы всегда хранится по смещению 49. Вот пример кода, который достаёт версию из себя:
function GetMyVersion:string;
type
TVerInfo=packedrecord
Nevazhno: array[0..47]ofbyte; // ненужные нам 48 байт
Minor,Major,Build,Release: word; // а тут версияend;
var
s:TResourceStream;
v:TVerInfo;
begin
result:='';
try
s:=TResourceStream.Create(HInstance,'#1',RT_VERSION); // достаём ресурсif s.Size>0thenbegin
s.Read(v,SizeOf(v)); // читаем нужные нам байты
result:=IntToStr(v.Major)+'.'+IntToStr(v.Minor)+'.'+ // вот и версия...IntToStr(v.Release)+'.'+IntToStr(v.Build);
end;
s.Free;
except; end;
end;
Просто так операция делается за один раз - прочитали и всё.
Хотя никто не запрещает модернизировать код. Вариантов реализации можно придумать много. Это лишь один из них, как рабочий пример.
Не убогий, а тупо прямолинейный.
Решение задачи влоб.
Можно было и поизящней нарисовать, но какой был, такой и дал.
Решить задачу можно по разному, результат один.
Незачем критиковать код. Он нормально работает и основной принцип показывает.
Да, далеко не самая красивая реализация.
Но рисовать красивую было лень
Нормальные у кодгира классы. Не нравится - не ешь. Пиши на ц++
А твой код работает по общему принципу.
Подобное решение есть и в спраке дельфи.
Фишка моего кода как раз в другом - получение своей версии из своего ресурса, а не обращение к своему файлу, как к постороннему.
Мой код показывает именно это.
Что-то неправильное происходит - в Хелпе - перечислены ключи типов ресурсов, а в самой Дельфи - нет.... 8о
В конструкторе TResourceStream.Create просто заполняется внутреннее поле ResType: PChar.
Нигде этот ResType не сравнивается, а просто вызывается Kernel32-функция FindResource и ей передается значение этого ключа (у нас - RT_VERSION)...
Подскажите, пожалуйста, где копать? Я буду рад даже за константу (PChar), чтобы вручную определить RT_VERSION
type
TLangChrSet = array[0..1] of word;
PLangChrset = ^TLangChrSet;
var
s, res: string;
n, Len, i: DWORD;
Buf: PChar;
Value: PChar;
LangChrSet: PLangChrSet;
begin
Res:='';
S := Application.ExeName;
n := GetFileVersionInfoSi
ze(PChar(S), n);
if n > 0 then
begin
Buf := AllocMem(n);
GetFileVersionInfo(P
Char(S), 0, n, Buf);
if VerQueryValue(Buf, PChar('VarFileInfo\Translation'), pointer(LangChrset),
Len) then
begin
s:=Format('%.4x%. 4x',[LangChrSet^[0],
LangChrSet^[1]]); // Определил кодовую страницу информации
i:=3; // FileVersion
if VerQueryValue(Buf, PChar('StringFileInf
o\' + s + '\' + InfoStr[i]), Pointer(Value), L...
Благодарен за пример!!!
re: - [quote=Анонимно]У меня при запуске такая ошибка:_http://ra...
При запуске установки Delphi 2010, пишет что ему нужен Microsoft...
[url=http://www.isfarinka.ru][img]http://www.isfarinka.ru/e107_i...
re: - [quote=alexm]конечно подборочка супер - нечего сказать!Но...
комментарий к теме - Только тут мрамор Киев по приемлемой цене
Два предыдущих топика относятся к модераторам uNet.
Жду письма с правильным URL активации.
Ваша ошибка - Вы оправили не полный адрес активации:http://www.u...
Либо DelphiDistiller не работает, либо чего-то не понимаю, после...