2012/9/28 Bernd :
Show quoted text 24 lines
I need to read the version number of the currently active project in
my design time package. For this I have written the following code:
function TSettings.GetVersion: String;
var
Res: TAbstractProjectResources;
ResVer: TProjectVersionInfo;
begin
Res := LazarusIDE.ActiveProject.Resources as TAbstractProjectResources;
ResVer := Res.Resource[TProjectVersionInfo] as TProjectVersionInfo;
Result := Format('%d.%d.%d.%d', [ResVer.MajorVersionNr,
ResVer.MinorVersionNr,
ResVer.RevisionNr,
ResVer.BuildNr]);
end;
It needs the unit W32VersionInfo which is in the package LCL. Now I
have noticed that when adding LCL as a depedency to my package I
cannot compile the IDE from a clean directory, obviously when using
IDE while IDE is not yet compiled seems to be not such a good idea. Is
there a better way to get the version number? I could not find any
other place to access it.
Bernd
type
{ TMyAbstractProjectResources }
TMyAbstractProjectResources = class(TAbstractProjectResources)
// need this to call a protected class function
class function GetList: TList;
end;
TFileProductVersion = array[0..3] of word;
{This should have the same memory layout as the original one}
TSameLayoutAsTProjectVersionInfo = class(TAbstractProjectResource)
FAutoIncrementBuild: boolean;
FHexCharSet: string;
FHexLang: string;
FStringTable: TObject;
FUseVersionInfo: boolean;
FVersion: TFileProductVersion;
// more fields follow but we are not
// interested anymore, only need FVersion
end;
function TSettings.GetVersion: String;
var
ResList: TAbstractProjectResources;
Resource: TAbstractProjectResource;
ResClass: TAbstractProjectResourceClass;
ResClassList: TList;
P: Pointer;
VerInfo: TSameLayoutAsTProjectVersionInfo;
begin
ResList := LazarusIDE.ActiveProject.Resources as TAbstractProjectResources;
ResClassList := TMyAbstractProjectResources.GetList;
for P in ResClassList do begin
ResClass := TAbstractProjectResourceClass(P);
Resource := ResList.Resource[ResClass];
if Resource.ClassName = 'TProjectVersionInfo' then begin
VerInfo := TSameLayoutAsTProjectVersionInfo(Resource);
Result := Format('%d.%d.%d.%d', [VerInfo.FVersion[0],
VerInfo.FVersion[1],
VerInfo.FVersion[2],
VerInfo.FVersion[3]]);
break;
end;
end;
end;
As you can see I am really desperate. The problem with the above code is that it will break as soon as there are changes made to the layout of the first 6 fields of the TProjectVersionInfo class. I have also tried to find any way to read from the currently opened projectinfo file but I cannot find anything other other than CustomData (and I don't want to read it directly from disk because there could be unsaved changes to the version number). Is there really no "normal" way for me to read the version number?