ProGestion/Base/InfoProject.pas
2007-06-21 16:12:43 +00:00

188 lines
6.2 KiB
ObjectPascal

{
===============================================================================
Copyright (©) 2005. Rodax Software.
===============================================================================
Los contenidos de este fichero son propiedad de Rodax Software titular del
copyright. Este fichero sólo podrá ser copiado, distribuido y utilizado,
en su totalidad o en parte, con el permiso escrito de Rodax Software, o de
acuerdo con los términos y condiciones establecidas en el acuerdo/contrato
bajo el que se suministra.
-----------------------------------------------------------------------------
Web: www.rodax-software.com
===============================================================================
Fecha primera versión: 17-05-2005
Versión actual: 1.0.0
Fecha versión actual: 17-05-2005
===============================================================================
Modificaciones:
Fecha Comentarios
---------------------------------------------------------------------------
===============================================================================
}
unit InfoProject;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;
type
TInfoProject = class(TComponent)
private
{ Private declarations }
FFVIBuff: Pointer;
FFVISize: DWord;
FHandle: DWord;
FFileName: String;
FLanguage: Word;
FCodePage: Word;
FLanguageCodePage: String;
FCompanyName: String;
FFileDescription: String;
FFileVersion: String;
FInternalName: String;
FLegalCopyright: String;
FLegalTradeMarks: String;
FOriginalFileName: String;
FProductName: String;
FProductVersion: String;
FComments: String;
procedure ReadFixedFileInfo;
function GetLangCPage: String;
function GetStringFileInfo(S: String): String;
procedure SetFileName(const Value: String);
protected
{ Protected declarations }
public
{ Public declarations }
constructor Create(AOwner: TComponent); override;
function LanguageStr(Language: Word): String;
property FileName: String read FFileName write SetFileName;
property Language: Word read FLanguage;
property CodePage: Word read FCodePage;
property LanguageCodePage: String read FLanguageCodePage;
property CompanyName: String read FCompanyName;
property FileDescription: String read FFileDescription;
property FileVersion: String read FFileVersion;
property InternalName: String read FInternalName;
property LegalCopyright: String read FLegalCopyright;
property LegalTradeMarks: String read FLegalTradeMarks;
property OriginalFileName: String read FOriginalFileName;
property ProductName: String read FProductName;
property ProductVersion: String read FProductVersion;
property Comments: String read FComments;
published
{ Published declarations }
end;
implementation
{ TInfoProject }
constructor TInfoProject.Create(AOwner: TComponent);
begin { of TInfoProject.Create }
inherited Create(AOwner);
{ build current EXE filename }
FileName := ParamStr(0);
end; { of TInfoProject.Create }
procedure TInfoProject.ReadFixedFileInfo;
begin { of TInfoProject.ReadFixedFileInfo }
{ determine size of buffer required }
FFVISize := GetFileVersionInfoSize(PChar(FileName), FHandle);
{ create buffer }
GetMem(FFVIBuff, FFVISize);
try
{ load buffer }
GetFileVersionInfo(PChar(FileName), FHandle, FFVISize, FFVIBuff);
{ extract the language/codepage info }
FLanguageCodePage := GetLangCPage;
{ extract the other info }
FCompanyName := GetStringFileInfo('CompanyName');
FFileDescription := GetStringFileInfo('FileDescription');
FFileVersion := GetStringFileInfo('FileVersion');
FInternalName := GetStringFileInfo('InternalName');
FLegalCopyright := GetStringFileInfo('LegalCopyright');
FLegalTradeMarks := GetStringFileInfo('LegalTradeMarks');
FOriginalFileName := GetStringFileInfo('OriginalFileName');
FProductName := GetStringFileInfo('ProductName');
FProductVersion := GetStringFileInfo('ProductVersion');
FComments := GetStringFileInfo('Comments');
finally
{ dispose buffer }
FreeMem(FFVIBuff, FFVISize);
end;
end; { of TInfoProject.ReadFixedFileInfo }
function TInfoProject.LanguageStr(Language: Word): String;
var
P: array[0..255] of Char;
Len: Word;
begin { of TInfoProject.LanguageStr }
Len := VerLanguageName(Language, P, SizeOf(P));
if (Len > SizeOf(P)) then
begin
{ if this occurs then the P buffer is too small }
{ so we will truncate the returned string }
Len := SizeOf(P);
end;
SetString(Result, P, Len);
end; { of TInfoProject.LanguageStr }
function TInfoProject.GetLangCPage: String;
var
SearchString: String;
FVILang: array of Byte;
Len: DWORD;
begin { of TInfoProject.GetLangCPage }
Result := '00000000';
if (FFVIBuff <> NIL) then
begin
SearchString := '\VarFileInfo\Translation';
if VerQueryValue(FFVIBuff, PChar(SearchString),
Pointer(FVILang), Len) then
begin
FLanguage := FVILang[0] + FVILang[1]*$100;
FCodePage := FVILang[2] + FVILang[3]*$100;
Result := IntToHex(FLanguage, 4) + IntToHex(FCodePage, 4);
end;
end;
end; { of TInfoProject.GetLangCPage }
function TInfoProject.GetStringFileInfo(S: String): String;
var
SearchString: String;
P: PChar;
Len: DWORD;
begin { of TInfoProject.GetStringFileInfo }
Result := '';
if (FFVIBuff <> NIL) then
begin
SearchString := '\StringFileInfo\'+FLanguageCodePage+'\'+S;
if VerQueryValue(FFVIBuff, PChar(SearchString), Pointer(P), Len) then
begin
{ coded with StrLen to ditch the trailing #0 character }
SetString(Result, P, StrLen(P));
end;
end;
end; { of TInfoProject.GetStringFileInfo }
procedure TInfoProject.SetFileName(const Value: String);
begin { of TInfoProject.SetFileName }
FFileName := ExpandUNCFileName(Value);
{ read fileinfo from this new file }
ReadFixedFileInfo;
end; { of TInfoProject.SetFileName }
end.