Wersja pliku DLL

0

Witajcie

Mam taki problem. Tan kodzik powinien pokazać wersje podanego pliku, tymczasem nie chce działać jak należy. Może ktoś wie jak go poprawić?

const
InfoNum = 10;
InfoStr: array[1..InfoNum] of string = ('CompanyName', 'FileDescription', 'FileVersion', 'InternalName', 'LegalCopyright', 'LegalTradeMarks', 'OriginalFileName', 'ProductName', 'ProductVersion', 'Comments');
var
N, Len, I : DWORD;
Buf : PChar;
Value : PChar;
begin
N := GetfileVersion('C:xxxxx.dll');
if N > 0 then
begin
Buf := AllocMem(N);
Memo1.Lines.Add('VersionInfoSize = ' + IntToStr(N));
GetfileVersion(PChar('C:xxxxx.dll'));

for I := 1 to InfoNum do if VerQueryValue(Buf, PChar('StringFileInfo40904E4' + InfoStr[I]), Pointer(Value), Len) then Memo1.Lines.Add(InfoStr[I] + ' = ' + Value);

FreeMem(Buf, N);
end
else Memo1.Lines.Add('No version information found');
end;

0

Uprościłem troche ten kodzik. nie wiem jak on ma pobierać wersje pliku, jak ktoś wie jak to zrobić to niech powie, bo jestem bardzo ciekaw.

const
InfoNum = 10;
InfoStr: array[1..InfoNum] of string = ('CompanyName', 'FileDescription', 'FileVersion', 'InternalName', 'LegalCopyright', 'LegalTradeMarks', 'OriginalFileName', 'ProductName', 'ProductVersion', 'Comments');
var
N, Len, I : DWORD;
Buf       : PChar;
Value     : PChar;
begin
N := GetFileVersionInfoSize('C:\....dll',n);
i:=3;
Buf := AllocMem(N);
Memo1.Lines.Add('VersionInfoSize = ' + IntToStr(N));
GetFileVersionInfo(PChar('C:\....dll'), 0, N, Buf);
VerQueryValue(Buf, PChar('StringFileInfo\040904E4\' + InfoStr[I]), Pointer(Value), Len); Memo1.Lines.Add(InfoStr[I] + ' = ' + value);
FreeMem(Buf, N);
end;
0

W helpie delphi na temat pobierania wersji pliku napisane jest coś takiego:

function GetFileVersion(const AFileName: string): Cardinal;

Doczynienia z delphi mam od niedawna, więc mam pytania, jak można to wy<ort>kokoRZystaćystać</ort> do pobrania wersji pliku, bo ten przykład wyżej jest jakiś pokręcony.

0

Zobaczcie napisałem taki kodzik:

 label1.caption:=inttostr(getfileversion('c:/plik.dll'));

Ale program milczy, proszę ort! mi, bo ten problem mnie dręczy.

0

U mnie pokazują się jakieś nieznane liczby, może na tych liczbach trzeba przeprowadzić jakieś działanie, ale nie wiem jakie.

// Kolejny, który sam odpowiada na swoje posty, ehhh - detox

0

Robie to aby odświeżyć temat.

0

Trzeba było trochę pomyśleć i poczytać helpa i poprzeglądać forum, zanim zaczniesz smiecić bazę [glowa]

1.Ten kod już dawałem pare razy:

function TForm1.GetVersionString(VerStr,AppName : String) : String;
var
  FileName: String;
  Size    : DWORD;
  Handle  : DWORD;
  Len     : UINT;
  Buffer  : PChar;
  Value   : PChar;
  TransNo : PLongInt;
  SFInfo  : String;
begin
  Result := '';
  FileName := AppName;
  Size := GetFileVersionInfoSize(PChar(FileName), Handle);
  if Size > 0 then begin
    Buffer := AllocMem(Size);
    try
      GetFileVersionInfo(PChar(FileName), 0, Size, Buffer);
      VerQueryValue(Buffer, PChar('VarFileInfo\Translation'),
                     Pointer(TransNo), Len);
      SFInfo := Format('%s%.4x%.4x%s%s%', ['\StringFileInfo\',
        LoWord(TransNo^), HiWord(Transno^), '\', VerStr]);
      if VerQueryValue(Buffer, PChar(SFInfo),
                      Pointer(Value), Len) then
        Result := Value;
    finally
      { always release memory }
      if Assigned(Buffer) then
        FreeMem(Buffer, Size);
    end;
  end;

przykład

GetVersionString('FileVersion','C:\WinME\System\shell32.dll');
GetFileVersion('C:\Windows\shell32.dll') ;

Zwraca wersje bibioteki, ale w innym formacie, rozszyfruj w jakim.

Jeżeli żaden kod ci nie działa to znaczy, że bibioteka jest 16-bitowa, a tam nie znajdziesz sekcji VERSIONINFO.

0
<quote>
GetFileVersion('C:\Windows\shell32.dll') ;

Zwraca wersje bibioteki, ale w innym formacie, rozszyfruj w jakim.
<quote>

Wim że w innym formacie, gdybym wiedział jak z tego wyciągnąć wersje pliku, nie tworzył bym tego wątku.

0

Może ja jestem za głupi na to, zrobiłem tak: Przepisałem te funkcje a potem w onclick buttona wpisałem

label1.caption:=GetVersionString('FileVersion','C:WinMESystemshell32.dll'); 

i guzik to dało, nic się nie pokazało.

0

Czy w ogóle zmieniłeś ścieżkę do pliku? [rotfl]

Daj C:\Windows\System\shell32.dll

0

No pewnie, w poprzednim poście <ort>po prostu</ort> zkopiowałem to z twojego posta.

0

Po wykonaniu tej operacji text z labela znika(jest pusty), nawet jak ścieżka, którą podałem to było: C:\Windows\System\shell32.dll

0

<quote>2.

GetFileVersion('C:\Windows\shell32.dll') ;

Zwraca wersje bibioteki, ale w innym formacie, rozszyfruj w jakim.
quote>

Niech ktoś mi powie, w jaki sposób uzyskać za pomocą tego kodu wersje pliku, bo mnie już brakuje pomysłów.

0

Hehe, w dziwnym formacie to wyświetla wersje(mowa o drugim przykładzie pierwszy mi nie działa), w jednych plikach ta liczba ma 5 znaków w innych, 6 mimo że oryginalna wersja ma 4 znaki i kropki między nimi.

0

Pisze ten post, aby odświeżyć temat, bo nadal zamiast pokazać wersje pliku pokazuje mi pustkę, i mam proźbę do Moderatorów nie kasujecie od razu tego posta.

0

Wybaczcie, że odkopuję temat ale może przyda się to potomności.

Windows zwraca 64 bitową informację o wersji więc 2 bajty odpowiadają jednej sekcji wersji...

function ShortVerToStr(ver:Longword):string;
begin
  Result:=IntToStr((ver shr 24) and $ff)+'.'+IntToStr((ver shr 16) and $ff)+'.'+
    IntToStr((ver shr 8) and $ff)+'.'+IntToStr(ver and $ff);
end;

Function VerToShortVer(const ver:int64):LongWord;
var
  rec:Int64Rec absolute ver;
begin
  Result:=((rec.Lo shr 8) and $ff00) or (rec.Lo and $ff);
  Result:=Result or ((rec.Hi shl 8) and $ff000000) or ((rec.Hi shl 16) and $ff0000);
end;

Function VerToStr(const ver:int64):string;
var
  rec:Int64Rec absolute ver;
begin
  Result:=IntToStr(rec.Hi shr 16)+'.'+IntToStr(rec.Hi and $ffff)+'.'+
    IntToStr(rec.Lo shr 16)+'.'+IntToStr(rec.Lo and $ffff);
end;

Function GetVersion(const Plik:string):int64;
var
  handle:THandle;
  size:LongWord;
  ptr:pointer;
  FileName:string;
  FI: PVSFixedFileInfo;
  res:Int64Rec absolute Result;
begin
  Result := -1;
  // GetFileVersionInfo podczas parasowania modyfikuje nazwe pliku
  // Kopiujemy oryginalną nazwę do osobnej zmiennej
  FileName := Plik;
  UniqueString(FileName);
  size:=GetFileVersionInfoSize(PChar(plik),handle);
    if size>0 then begin
      ptr:=GetMemory(size);
        try
          if GetFileVersionInfo(PChar(FileName),handle,size,ptr) then begin
            if VerQueryValue(ptr, '\', Pointer(FI), Size) then begin
              res.Hi:=FI.dwFileVersionMS;
              res.Lo:=FI.dwFileVersionLS;
            end;
          end else
            RaiseLastOSError;
        finally
          FreeMemory(ptr);
        end;
    end else
      RaiseLastOSError;
end;

GetVersion - zwraca wersję pliku
VerToStr - konwertuję wersję na napis w formacie 1.2.3.4
VerToShortVer - konwertuje wersję na krótki 4 bajtowy format wersji
ShortVerToStr - konwertuje krótki format wersji na napis w formacie 1.2.34

1 użytkowników online, w tym zalogowanych: 0, gości: 1