Jedenfalls, funktioniert es jetzt soweit ohne Manifest, werde morgen mal ein aktuelles einbinden und dann mal sehen.
Hinweis @ Jaenicke: In Deinem Programm wurde Delphi 5 nicht gefunden, weil der Eintrag nicht unter current_user zu finden war, sondern unter local_machine.
Dein Programm müsste man also so erweitern, dass es den Pfad auch unter diesen Bedingungen findet:
Delphi-Quellcode:
function TCompileProcess.GetDelphiRootPath(const ADelphiVersion: string): string;
var
Reg: TRegistry;
begin
Result := '';
if FRegistryPath = '' then
FRegistryPath := GetRegistryPath(ADelphiVersion, True);
Reg := TRegistry.Create(KEY_READ);
try
Reg.RootKey := HKEY_CURRENT_USER;
if Reg.OpenKeyReadOnly(FRegistryPath) then
begin
Result := ExtractFilePath(Reg.ReadString('App'));
Reg.CloseKey();
end;
if Result = '' then // neu hier
begin
Reg.RootKey := HKEY_LOCAL_MACHINE;
if Reg.OpenKeyReadOnly(FRegistryPath) then
begin
Result := ExtractFilePath(Reg.ReadString('App'));
Reg.CloseKey();
end;
end;
finally
Reg.Free();
end;
end;
Übrigens compiliert das Programm bei Deiner Lösung nicht, weil es offensichtlich eine Reihe von Pfadangaben auflöst. Allerdings stimmen davon einige nicht mehr und dann bricht der Compiler ab.
Ich verwende daher nur den reinen Compileraufruf, seltsamerweise compiliert er, obwohl 2 Units in anderen Verzeichnissen stehen (die könnte der Compiler aber auflösen, aus den Angaben der Projektdatei (
dpr)).
Dank Deines Beispiels habe ich gesehen, wie man den output des Compilers (das in Deinem Programm ja in ein Konsolenfenster geht) abfangen kann. Habe ich bei mir so gelöst, dass ich das in meinem Programm in ein Memo ausgebe.
Der Output erscheint mir aber etwas seltsam (siehe anliegenden Screenschot unten).