kolmck/Addons/MCKMHXP.pas

268 lines
7.0 KiB
ObjectPascal

unit MCKMHXP;
// MHXP Êîìïîíåíò (MHXP Component)
// Àâòîð (Author): Æàðîâ Äìèòðèé (Zharov Dmitry) aka Ãýíäàëüô (Gandalf)
// Äàòà ñîçäàíèÿ (Create date): 14-íîÿ(nov)-2001
// Äàòà êîððåêöèè (Last correction Date): 21-àïð(apr)-2003
// Âåðñèÿ (Version): 1.17
// EMail: Gandalf@kol.mastak.ru
// WWW: http://kol.mastak.ru
// Áëàãîäàðíîñòè (Thanks):
// Alexander Pravdin
// Íîâîå â (New in):
// V1.17
// [+] Âíåøíèé ìàíèôåñò (External manifest) [KOLnMCK]
//
// V1.16
// [+] Ïîääåðæêà D7 (D7 Support) [KOLnMCK]
//
// V1.15
// [+] Ïîääåðæêà D6 (D6 Support) <Thanks to Alexander Pravdin> [KOLnMCK]
//
// V1.14
// [!.] Íåìíîãî ïîäïðàâèë (Small Fixing) [MCK]
//
// V1.13
// [+] Tag [MCK]
// [*] Code MCK Optim-z [MCK]
//
// V1.12
// [*] Hide Tag as unused [MCK]
// [*] Del Unused modules [MCK]
//
// V1.11
// [*] Needn't to create and free KOLObj [MCK]
// [*] Nearly clear KOL-file [KOL]
//
// V1.1
// [!] Resource Compile [MCK]
//
// Ñïèñîê äåë (To-Do list):
// 1. Îïòèìèçèðîâàòü (Optimize)
// 2. Ïîä÷èñòèòü (Clear Stuff)
// 3. XP äîëæåí áûòü îäèí íà ïðîåêò (XP in Project must be ONE)
interface
uses
KOL, Mirror, Classes, Windows, Forms, SysUtils,
{$WARNINGS OFF}
ToolIntf, Exptintf
{$WARNINGS ON}
;
type
TKOLMHXP = class(TKOLObj)
private
FAppName: string;
FDescription: string;
FExternal: Boolean;
procedure SetAppName(Value: string);
procedure SetDescription(Value: string);
procedure SetExternal(const Value: Boolean);
protected
function AdditionalUnits: string; override;
procedure SetupFirst(SL: TStringList; const AName, AParent, Prefix: string); override;
function NotAutoFree: Boolean; override;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
published
property AppName: string read FAppName write SetAppName;
property Description: string read FDescription write SetDescription;
property External: Boolean read FExternal write SetExternal;
end;
procedure Register;
{$R 'MCKMHXP.dcr'}
implementation
function SaveManifest(AppName, Description, ThemeName: string): Boolean;
var
RL: TStringList;
begin
Result := True;
RL := TStringList.Create;
RL.Add('<?xml version="1.0" encoding="UTF-8" standalone="yes"?>');
RL.Add('<assembly xmlns="urn:schemas-microsoft-com:asm.v1"');
RL.Add('manifestVersion="1.0">');
RL.Add('<assemblyIdentity');
RL.Add(' name="' + AppName + '"');
RL.Add(' processorArchitecture="x86"');
RL.Add(' version="1.0.0.0"');
RL.Add(' type="win32"/>');
RL.Add('<description>' + Description + '</description>');
RL.Add('<dependency>');
RL.Add(' <dependentAssembly>');
RL.Add(' <assemblyIdentity');
RL.Add(' type="win32"');
RL.Add(' name="Microsoft.Windows.Common-Controls"');
RL.Add(' version="6.0.0.0"');
RL.Add(' processorArchitecture="x86"');
RL.Add(' publicKeyToken="6595b64144ccf1df"');
RL.Add(' language="*"');
RL.Add(' />');
RL.Add(' </dependentAssembly>');
RL.Add('</dependency>');
RL.Add('</assembly>');
RL.SaveToFile(ThemeName);
RL.Free;
end;
procedure GenerateManifestResource(AppName, Description: string; const RsrcName, FileName: string;
var Updated: Boolean);
var
RL: TStringList;
Buf1, Buf2: PChar;
S: string;
I, J: Integer;
F: THandle;
begin
if not SaveManifest(AppName, Description, ProjectSourcePath + RsrcName + '.manifest' {'themed.manifest'}) then
Exit;
RL := TStringList.Create;
RL.Add('1 24 "' + RsrcName + '.manifest"'); {'themed.manifest'}
RL.SaveToFile(ProjectSourcePath + FileName + '.rc');
RL.Free;
Buf1 := nil;
Buf2 := nil;
I := 0; J := 0;
S := ProjectSourcePath + FileName + '.res';
if FileExists(S) then
begin
I := FileSize(S);
if I > 0 then
begin
GetMem(Buf1, I);
F := KOL.FileCreate(S, ofOpenRead or ofShareDenyWrite or ofOpenExisting);
if F <> THandle(-1) then
begin
KOL.FileRead(F, Buf1^, I);
KOL.FileClose(F);
end;
end;
end;
ExecuteWait(ExtractFilePath(Application.ExeName) + 'brcc32.exe', '"' +
ProjectSourcePath + FileName + '.rc' + '"',
ProjectSourcePath, SW_HIDE, INFINITE, nil);
if FileExists(S) then
begin
J := FileSize(S);
if J > 0 then
begin
GetMem(Buf2, J);
F := KOL.FileCreate(S, ofOpenRead or ofShareDenyWrite or ofOpenExisting);
if F <> THandle(-1) then
begin
KOL.FileRead(F, Buf2^, J);
KOL.FileClose(F);
end;
end;
end;
if (Buf1 = nil) or (I <> J) or
(Buf2 <> nil) and not CompareMem(Buf1, Buf2, J) then
begin
Updated := TRUE;
end;
if Buf1 <> nil then FreeMem(Buf1);
if Buf2 <> nil then FreeMem(Buf2);
end;
constructor TKOLMHXP.Create(AOwner: TComponent);
begin
inherited;
FAppName := 'Organization.Division.Name';
FDescription := 'Application description here';
FExternal := True;
end;
destructor TKOLMHXP.Destroy;
begin
inherited;
end;
function TKOLMHXP.AdditionalUnits;
begin
Result := ', KOLMHXP';
end;
procedure TKOLMHXP.SetupFirst(SL: TStringList; const AName,
AParent, Prefix: string);
var
RsrcFile, RsrcName, s: string;
begin
RsrcName := UpperCase(ParentKOLForm.FormName + '_' + Name);
RsrcFile := ParentKOLForm.FormName + '_' + Name;
SL.Add(Prefix + 'InitCommonControls;');
if FExternal then
begin
if ToolServices <> nil then
begin
s := ToolServices.GetProjectName;
Delete(s, Length(s) - Length(ExtractFileExt(s)) + 1, Length(ExtractFileExt(s)));
s := s + '.exe';
SaveManifest(AppName, Description, s + '.manifest');
DeleteFile(ProjectSourcePath + RsrcName + '.manifest');
end;
end
else
begin
// SL.Add(Prefix + 'InitCommonControls;');
SL.Add(Prefix + '{$R ' + RsrcFile + '.RES}');
GenerateManifestResource(AppName, Description, RsrcName, RsrcFile, fUpdated);
if ToolServices <> nil then
begin
s := ToolServices.GetProjectName;
Delete(s, Length(s) - Length(ExtractFileExt(s)) + 1, Length(ExtractFileExt(s)));
s := s + '.exe';
DeleteFile(s + '.manifest');
end;
end;
end;
function TKOLMHXP.NotAutoFree: Boolean;
begin
Result := True;
end;
procedure TKOLMHXP.SetAppName(Value: string);
begin
if FAppName <> Value then
begin
FAppName := Value;
Change;
end;
end;
procedure TKOLMHXP.SetDescription(Value: string);
begin
if FDescription <> Value then
begin
FDescription := Value;
Change;
end;
end;
procedure TKOLMHXP.SetExternal(const Value: Boolean);
begin
FExternal := Value;
Change;
end;
procedure Register;
begin
RegisterComponents('KOLAddons', [TKOLMHXP]);
end;
end.