Как выдрать инфу о версии из файла
Вопрос: а как вытащить инфу об организации, копирайте и комментарии (в опциях проекта она тоже прописыватся)?
p: pointer;
p2: PVSFixedFileInfo;
h: DWORD;
l: UINT;
Major1, Major2,Minor1, Minor2: Integer;
begin
len:=GetFileVersionInfoSize(pchar(Application.exename),h);
GetMem(p,len);
try
GetFileVersionInfo(pchar(Application.exename),0,len,p);
VerQueryValue(p,'\',Pointer(p2),l);
Major1 := p2.dwFileVersionMS shr 16;
Major2 := p2.dwFileVersionMS and $FFFF;
Minor1 := p2.dwFileVersionLS shr 16;
Minor2 := p2.dwFileVersionLS and $FFFF;
Label5.Caption:=IntToStr(Major1)+'.'+IntToStr(Major2)+'.'+IntToStr(Minor1)+'.'+IntToStr(Minor2);
VerQueryValue(p,'\',Pointer(p2),l);
finally
FreeMem(p);
end;
end
Ниже приведен раздобытый мною на задворках инета код, который вытаскивает версию проги из файла.
Вопрос: а как вытащить инфу об организации, копирайте и комментарии (в опциях проекта она тоже прописыватся)?
Пример из хелпа по WinAPI. Достает описание файла. Таким же образом можешь достать все остальное.
TEXT("\\StringFileInfo\\040904E4\\FileDescription"),
&lpBuffer,
&dwBytes);
Пример из хелпа по WinAPI. Достает описание файла. Таким же образом можешь достать все остальное.
TEXT("\\StringFileInfo\\040904E4\\FileDescription"),
&lpBuffer,
&dwBytes);
Это все понятно, хэлп по ВинАПИ я тоже читал...
Тока там не написано что это за параметр такой lpBuffer.
Вообще Дельфи говорит что на месте &lpBuffer должен стоять Pointer, но как из него потом строку зафигачить?
Это все понятно, хэлп по ВинАПИ я тоже читал...
Тока там не написано что это за параметр такой lpBuffer.
Вообще Дельфи говорит что на месте &lpBuffer должен стоять Pointer, но как из него потом строку зафигачить?
lpBuffer - это массив, всего лишь обычный массив типа char. Объяви его так: buf: Array [1..1024] of Char, например.
Потом передавай его в параметрах как указатель на первый жлемент массива (@buf[1]), в качестве значения pwBytes передай SizeOf(buf)
Вопрос: а как вытащить инфу об организации, копирайте и комментарии (в опциях проекта она тоже прописыватся)?
Найди где-нить в Сети библиотеку RxLib. Она поставляется в исходниках. В RxVerInfo есть работающий класс для доступа к информации о версии.
Даже если она не будет у тебя ставиться, можешь хотя бы посмотреть код, как там было реализовано.
lpBuffer - это массив, всего лишь обычный массив типа char. Объяви его так: buf: Array [1..1024] of Char, например.
Потом передавай его в параметрах как указатель на первый жлемент массива (@buf[1]), в качестве значения pwBytes передай SizeOf(buf)
Не, не катит такая фишка. Дельфи ругается, что тип неправильный (на @buf[1])
А в качстве значения dwBytes ниче передавать не нужно, это параметр-переменная, функция туда возвращает размер строки.
Найди где-нить в Сети библиотеку RxLib. Она поставляется в исходниках. В RxVerInfo есть работающий класс для доступа к информации о версии.
Даже если она не будет у тебя ставиться, можешь хотя бы посмотреть код, как там было реализовано.
Большое спасибо SmartSoft'у. Ты вылечил мой трабл.
Для всех итересующихся привожу работоспособный пример (Delphi 7.0 Enterprise под Win2000 SP3)
n, Len: DWORD;
Buf: PChar;
Value,p: Pointer;
s:string;
begin
S := Application.ExeName;
n := GetFileVersionInfoSize(PChar(S), n);
if n > 0 then
begin
Buf := AllocMem(n);
GetFileVersionInfo(PChar(S), 0, n, Buf);
VerQueryValue(Buf,'\VarFileInfo\Translation', p, Len);
s:=IntToHex(MakeLong(HiWord(Longint(P^)), LoWord(Longint(P^))),8 );
if VerQueryValue(Buf, PChar('\StringFileInfo\' + s + '\ProductName'), Value, Len)
then Label1.Caption:=StrPas(PChar(Value))
else Label1.Caption:='';
if VerQueryValue(Buf, PChar('\StringFileInfo\' + s + '\ProductVersion'), Value, Len)
then Label2.Caption:=StrPas(PChar(Value))
else Label2.Caption:='';
if VerQueryValue(Buf, PChar('\StringFileInfo\' + s + '\CompanyName'), Value, Len)
then Label3.Caption:=StrPas(PChar(Value))
else Label3.Caption:='';
FreeMem(Buf, n);
end;
end;
Всем удачи!