mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-11-18 18:49:32 +01:00
+ Added fileinfo unit
This commit is contained in:
parent
e7ce987525
commit
3e82220fd2
1020
fcl/win32/Makefile
1020
fcl/win32/Makefile
File diff suppressed because it is too large
Load Diff
@ -3,7 +3,7 @@
|
|||||||
#
|
#
|
||||||
|
|
||||||
[targets]
|
[targets]
|
||||||
units=classes $(INCUNITS) $(XMLUNITS) $(SHEDITUNITS) process
|
units=classes $(INCUNITS) $(XMLUNITS) $(SHEDITUNITS) process fileinfo
|
||||||
|
|
||||||
[defaults]
|
[defaults]
|
||||||
defaulttarget=win32
|
defaulttarget=win32
|
||||||
|
|||||||
169
fcl/win32/fileinfo.pp
Normal file
169
fcl/win32/fileinfo.pp
Normal file
@ -0,0 +1,169 @@
|
|||||||
|
{
|
||||||
|
$Id$
|
||||||
|
This file is part of the Free Component Library (FCL)
|
||||||
|
Copyright (c) 1999-2000 by the Free Pascal development team
|
||||||
|
|
||||||
|
See the file COPYING.FPC, included in this distribution,
|
||||||
|
for details about the copyright.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
|
||||||
|
**********************************************************************}
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
Based on getver by Bernd Juergens - Munich, Germany
|
||||||
|
email :bernd@promedico.com
|
||||||
|
|
||||||
|
Usage : Drop component on form. Set desired file name using
|
||||||
|
FileVersionInfo.filename := 'c:\winnt\system32\comctl32.dll'
|
||||||
|
or something like that.
|
||||||
|
Read StringLists VersionStrings and VersionCategories.
|
||||||
|
|
||||||
|
or check a single entry:
|
||||||
|
FileVersionInfo1.fileName := 'd:\winnt\system32\comctl32.dll';
|
||||||
|
showMessage(FileVersionInfo1.getVersionSetting('ProductVersion'));
|
||||||
|
}
|
||||||
|
unit fileinfo;
|
||||||
|
{$mode objfpc}
|
||||||
|
interface
|
||||||
|
|
||||||
|
uses
|
||||||
|
Windows, SysUtils, Classes;
|
||||||
|
|
||||||
|
|
||||||
|
{ Record to receive charset }
|
||||||
|
type TTranslation = record
|
||||||
|
langID : WORD;
|
||||||
|
charset : WORD;
|
||||||
|
end;
|
||||||
|
|
||||||
|
type
|
||||||
|
TFileVersionInfo = class(TComponent)
|
||||||
|
private
|
||||||
|
FFileName : String;
|
||||||
|
FmyVersionStrings : TStringList;
|
||||||
|
FmyVersionCategories : TStringList;
|
||||||
|
|
||||||
|
procedure SetFileName (inp : string);
|
||||||
|
procedure readVersionFromFile;
|
||||||
|
protected
|
||||||
|
{ Protected-Deklarationen}
|
||||||
|
public
|
||||||
|
constructor Create(AOwner: TComponent); override;
|
||||||
|
function getVersionSetting(inp : string): String;
|
||||||
|
published
|
||||||
|
property fileName : string read FFileName write SetFileName;
|
||||||
|
property VersionStrings : TStringList read FmyVersionStrings;
|
||||||
|
property VersionCategories : TStringList read FmyVersionCategories;
|
||||||
|
end;
|
||||||
|
|
||||||
|
implementation
|
||||||
|
|
||||||
|
|
||||||
|
{ initialize everything }
|
||||||
|
constructor TFileVersionInfo.Create(AOwner: TComponent);
|
||||||
|
begin
|
||||||
|
FmyVersionStrings := TStringList.Create;
|
||||||
|
FmyVersionCategories := TStringList.Create;
|
||||||
|
FFileName := '';
|
||||||
|
inherited create(Aowner);
|
||||||
|
end;
|
||||||
|
|
||||||
|
{ Get filename, check if file exists and read info from file }
|
||||||
|
procedure TFileVersionInfo.SetFileName (inp : string);
|
||||||
|
begin
|
||||||
|
FmyVersionStrings.clear;
|
||||||
|
FmyVersionCategories.clear;
|
||||||
|
|
||||||
|
if fileexists(inp) then
|
||||||
|
begin
|
||||||
|
FFileName := inp;
|
||||||
|
readVersionFromFile;
|
||||||
|
end
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
FFileName := '';
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
{ read info from file }
|
||||||
|
procedure TFileVersionInfo.readVersionFromFile;
|
||||||
|
var struSize : Dword;
|
||||||
|
dwBytes,someDummy : Dword;
|
||||||
|
a,txt : array[0..256] of char;
|
||||||
|
p : pchar;
|
||||||
|
i : integer;
|
||||||
|
pp : pointer;
|
||||||
|
theFixedInfo : TVSFixedFileInfo;
|
||||||
|
theTrans : TTranslation;
|
||||||
|
s : string;
|
||||||
|
ts : TStringList;
|
||||||
|
begin
|
||||||
|
ts := TStringList.Create;
|
||||||
|
ts.add('CompanyName');
|
||||||
|
ts.add('FileDescription');
|
||||||
|
ts.add('FileVersion');
|
||||||
|
ts.add('InternalName');
|
||||||
|
ts.add('LegalCopyright');
|
||||||
|
ts.add('OriginalFilename');
|
||||||
|
ts.add('ProductName');
|
||||||
|
ts.add('ProductVersion');
|
||||||
|
|
||||||
|
strPCopy(a,FFileName);
|
||||||
|
{ get size of data }
|
||||||
|
struSize := GetFileVersionInfoSize(a,@someDummy);
|
||||||
|
if struSize=0 then exit;
|
||||||
|
p := NIL;
|
||||||
|
try
|
||||||
|
{ get memory }
|
||||||
|
GetMem(p,struSize+10);
|
||||||
|
{ get data }
|
||||||
|
if not GetFileVersionInfo(a,0,struSize,p) then exit;
|
||||||
|
{ get root info }
|
||||||
|
if not VerQueryValue(p,'\',pp,@dwBytes) then exit;
|
||||||
|
move(pp^,theFixedInfo,dwBytes);
|
||||||
|
|
||||||
|
{ get translation info }
|
||||||
|
if not VerQueryValue(p,'\VarFileInfo\Translation',pp,@dwBytes) then
|
||||||
|
exit;
|
||||||
|
move(pp^,theTrans,dwBytes);
|
||||||
|
|
||||||
|
{ iterate over defined items }
|
||||||
|
for i:=0 to ts.count-1 do
|
||||||
|
begin
|
||||||
|
s := '\StringFileInfo\'+inttohex(theTrans.langID,4)+inttohex(theTrans.charset,4)+'\'+ts[i];
|
||||||
|
StrPCopy(a,s);
|
||||||
|
if not VerQueryValue(p,a,pp,@dwBytes) then exit;
|
||||||
|
if dwBytes>0 then
|
||||||
|
begin
|
||||||
|
move(pp^,txt,dwBytes);
|
||||||
|
FmyVersionCategories.add(ts[i]);
|
||||||
|
FmyVersionStrings.add(StrPas(txt));
|
||||||
|
end
|
||||||
|
end;
|
||||||
|
finally
|
||||||
|
{ release memory }
|
||||||
|
FreeMem(p);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
{ get single version string }
|
||||||
|
function TFileVersionInfo.getVersionSetting(inp : string): String;
|
||||||
|
var i : integer;
|
||||||
|
begin
|
||||||
|
result := '';
|
||||||
|
for i:= 0 to FmyVersionCategories.Count -1 do
|
||||||
|
begin
|
||||||
|
if lowercase(FmyVersionCategories[i])=lowercase(inp) then
|
||||||
|
begin
|
||||||
|
result := FmyVersionStrings[i];
|
||||||
|
break;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
end.
|
||||||
|
|
||||||
Loading…
Reference in New Issue
Block a user