Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Das Programm wurde eventuell nicht richtig installiert. (https://www.delphipraxis.net/168691-das-programm-wurde-eventuell-nicht-richtig-installiert.html)

Bjoerk 4. Jun 2012 16:31

Das Programm wurde eventuell nicht richtig installiert.
 
Ich habe eine Installationsroutine (mit D 2007 compiliert), die nichts anderes macht als Verzeichnisse anzulegen, zu kopieren, ein paar Registry Einträge anlegt und ein paar Shortcuts anlegt. Das war’s.

Wenn ich von CD aus installiere, dann bekomme ich bei Win64 o. a. Meldung. Bissl blöd. Woran könnt’s liegen?

Gruß
Thomas

himitsu 4. Jun 2012 16:52

AW: Das Programm wurde eventuell nicht richtig installiert.
 
Du hast dein Programm als Admin ausgeführt?
Und wie nennt sich deine EXE, bzw. hast du in den Versionsinfos irgendwelche "verdächtigen" Texte hinterlegt?

Windows geht bei sowas davon aus, daß es sich um ein Setup handelt und prüft gewisse Dinge. (eventuell ob ein Uninstaller registriert wurde)
Wenn es Diese nicht findet, dann kommt eben die genannte Meldung.

jfheins 4. Jun 2012 19:47

AW: Das Programm wurde eventuell nicht richtig installiert.
 
Zitat:

Zitat von Bjoerk (Beitrag 1169478)
Ich habe eine Installationsroutine (mit D 2007 compiliert), die nichts anderes macht als Verzeichnisse anzulegen, zu kopieren, ein paar Registry Einträge anlegt und ein paar Shortcuts anlegt. Das war’s.
Wenn ich von CD aus installiere, dann bekomme ich bei Win64 o. a. Meldung. Bissl blöd. Woran könnt’s liegen?
Gruß
Thomas

Du legst keinen Eintrag in der Sytemsteuerung an und dein Manifest deklariert das Setup als nicht für Win7 (/Vista) entwickelt.

Lösung: Entweder einen Eintrag in der Systemsteuerung erzeugen oder dein Anwendungsmanifest anpassen ;-)

Bjoerk 4. Jun 2012 21:33

AW: Das Programm wurde eventuell nicht richtig installiert.
 
Programm Setup.exe wird als Admin ausgeführt (mit Mainfest {$R ...res}),
Uninstaller ist installiert und eingetragen.

Delphi-Quellcode:
var
  Reg: TRegistry;
begin
  Reg:= TRegistry.Create;
  try
    with Reg do
    begin
      RootKey:= HKey_LOCAL_MACHINE;
      OpenKey('SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\' + FProgApp.Key, true);
      WriteString('InstallLocation', FNachVerz);
      WriteString('DisplayIcon', FNachVerz + FProgApp.EXE);
      WriteString('DisplayName', FProgApp.Name);
      WriteString('DisplayVersion', FProgApp.VersionStr);
      WriteString('Publisher', 'XXXX Software');
      WriteString('URLInfoAbout', 'http://www.XXXX-software.de');
      WriteString('UninstallString', FVerzA + FProgApp.UnInst);
      WriteInteger('NoModify', 1);
      WriteInteger('NoRepair', 1);
      closeKey;
    end;
  finally
    Reg.Free;
    XXXXZertifikatAnlegen(FNachVerz, false);
  end;
end;

Bjoerk 5. Jun 2012 08:19

AW: Das Programm wurde eventuell nicht richtig installiert.
 
Die Meldung kommt nur, wenn von CD installiert wird!? :gruebel:

jaenicke 5. Jun 2012 09:14

AW: Das Programm wurde eventuell nicht richtig installiert.
 
Ich frage mich zwar, warum du nicht einfach InnoSetup oder ähnliches nimmst, wo das ja alles funktioniert, aber sei es drum:

Vielleicht erkennt Windows, dass du ohne Deaktivierung der Registry-Umleitung auf diese zugreifst. (So landet unter 64-Bit alles unter Wow6432Node, das normalerweise direkt unter Software steht.) Setups sollten entsprechend behandeln.

Oder versuchst du in irgendeiner Weise auf das eigene Verzeichnis zuzugreifen?

Bjoerk 5. Jun 2012 11:06

AW: Das Programm wurde eventuell nicht richtig installiert.
 
Hey jaenicke, genau so ist es, thanx.

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\ Windows\CurrentVersion\Uninstall\XXXX_Software

Soll Setup auf Win64 prüfen und dann den Pfad so vorgeben?

"Oder versuchst du in irgendeiner Weise auf das eigene Verzeichnis zuzugreifen?"

Was meinst du damit? Dahin wird halt kopiert, sonst nur gelesen.
C:\Program Files (x86)\XXX\

Daniel Schuhmann 5. Jun 2012 12:09

AW: Das Programm wurde eventuell nicht richtig installiert.
 
Umlaute/komischen Zeichensatz im Manifest?

Bjoerk 5. Jun 2012 15:38

AW: Das Programm wurde eventuell nicht richtig installiert.
 
Auch mit Umleitung ändert sich nichts, oder mach' ich da was falsch?

Umlaute/komischen Zeichensatz im Manifest habe ich nicht.

Könnte auch die Standardmeldung sein, wenn nach C:\Program Files (x86)\ installiert wird !?

Delphi-Quellcode:
function IsWow64: boolean;
type
  TIsWow64Process =
    function(Handle: Windows.THandle; var Res: Windows.BOOL): Windows.BOOL; stdcall;
var
  IsWow64Result: Windows.BOOL;
  IsWow64Process: TIsWow64Process;
begin
  Result:= False;
  if GetWInVersion = wvWin7 then
  begin
    IsWow64Process:=
      Windows.GetProcAddress(Windows.GetModuleHandle('kernel32'), 'IsWow64Process');
    if Assigned(IsWow64Process) then
    try
      IsWow64Process(Windows.GetCurrentProcess, IsWow64Result);
      Result:= IsWow64Result;
    except
      Result:= False;
    end;
  end;
end;

function GetRegUnInstallString: string;
var
  Substr: string;
begin
  if IsWow64 then
    Substr:= 'Wow6432Node\'
  else
    Substr:= '';
  Result:= 'SOFTWARE\' + Substr + 'Microsoft\Windows\CurrentVersion\Uninstall\' + progApp.Key;
end;

DeddyH 5. Jun 2012 15:43

AW: Das Programm wurde eventuell nicht richtig installiert.
 
Versuch es mal so: http://www.delphipraxis.net/86651-re...w6432node.html

Bjoerk 6. Jun 2012 17:12

AW: Das Programm wurde eventuell nicht richtig installiert.
 
Registry.Create(KEY_ALL_ACCESS OR KEY_WOW64_64KEY) funktioniert bei mir nicht. :wall:

DeddyH 6. Jun 2012 17:25

AW: Das Programm wurde eventuell nicht richtig installiert.
 
Welcher Fehler tritt denn auf?

Bjoerk 6. Jun 2012 17:41

AW: Das Programm wurde eventuell nicht richtig installiert.
 
Delphi-Quellcode:
OpenKey('SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\...', false)
wird nicht erkannt.

DeddyH 6. Jun 2012 17:51

AW: Das Programm wurde eventuell nicht richtig installiert.
 
Dann kann ich Dir leider nicht weiterhelfen, ich habe hier kein Win64 :(

Bjoerk 6. Jun 2012 17:59

AW: Das Programm wurde eventuell nicht richtig installiert.
 
Ich krieg' die Krise. Wenn ich einfach
TRegistry.Create(KEY_ALL_ACCESS) schreibe und den WowPfad benutze ist die Meldung weg.

Ist KEY_ALL_ACCESS nicht das Default bei Registry.Create? :gruebel:

Dalai 6. Jun 2012 18:05

AW: Das Programm wurde eventuell nicht richtig installiert.
 
Zitat:

Zitat von Bjoerk (Beitrag 1169736)
Delphi-Quellcode:
OpenKey('SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\...', false)
wird nicht erkannt.

Was heißt das "wird nicht erkannt"?

Dies funktioniert bei mir einwandfrei:
Delphi-Quellcode:
key:= TRegistry.Create;
try
    key.RootKey:= HKEY_LOCAL_MACHINE;
    key.Access:= KEY_READ;
    if (_bIsWow64 AND Self.bIsX64) then
        key.Access:= key.Access OR KEY_WOW64_64KEY;
    if key.OpenKey(sRegKey, False) then
        if key.ValueExists(sRegVal) then
           sRegData:= key.ReadString(sRegVal);
finally
    key.CloseKey;
    key.Free;
end; // try..finally
Die Variablen sRegKey, _bIsWow64 (bzw. deren Werte) kommen dabei von außen.

Ergänzung: Übrigens ist es Unsinn, mit einer 32 Bit Anwendung in den 64 Bit Zweig zu schreiben, gerade wenn es um solche Uninstall-Keys geht.

MfG Dalai

Luckie 6. Jun 2012 21:15

AW: Das Programm wurde eventuell nicht richtig installiert.
 
Zitat:

Zitat von Dalai (Beitrag 1169739)
Ergänzung: Übrigens ist es Unsinn, mit einer 32 Bit Anwendung in den 64 Bit Zweig zu schreiben, gerade wenn es um solche Uninstall-Keys geht.

Nicht ganz. Ich muss mit meinem Unsermanager (32-Bit) auch in einen 64-Bit Zweig der Registry schreiben.

Kann es sein, dass du eine Pfad hardcodiert hast und Windows jetzt denkt, dass die Anwendung nicht richtig installiert wurde, weil die Datei nicht gefunden werden konnte?

Dalai 6. Jun 2012 22:25

AW: Das Programm wurde eventuell nicht richtig installiert.
 
Zitat:

Zitat von Luckie (Beitrag 1169752)
Zitat:

Zitat von Dalai (Beitrag 1169739)
Ergänzung: Übrigens ist es Unsinn, mit einer 32 Bit Anwendung in den 64 Bit Zweig zu schreiben, gerade wenn es um solche Uninstall-Keys geht.

Nicht ganz. Ich muss mit meinem Unsermanager (32-Bit) auch in einen 64-Bit Zweig der Registry schreiben.

OK, es gibt Ausnahmen, aber dieser Fall der Uninstall-Keys gehört nicht dazu. Windows x64 verarbeitet beide Schlüssel (32 und 64 Bit), um die Liste der installierten Software zu erstellen; alles andere wäre ja auch Unsinn. Was ich aber eigentlich sagen wollte: es wäre (und ist) Unsinn, eine 32 Bit Applikation in den 64 Bit Uninstall-Zweig einzutragen, nur weil man ein 64 Bit Windows vor sich hat.

MfG Dalai

Bjoerk 8. Jun 2012 09:39

AW: Das Programm wurde eventuell nicht richtig installiert.
 
Ich hab die Komponente überarbeitet und dabei auch solche Uralt Dinger wie MkDir z.B. ersetzt. Mit Code #9 geht es geht jetzt. Luckie, ich benutze folgende Verzeichnisse:

Delphi-Quellcode:
function GetShellFolderPath(const aFolder: integer): string;
var
  pIIL: PItemIDList;
  szPath: array[0..Max_Path] of char;
  aMalloc: IMalloc;
begin
  Result:= '';
  OleCheck(SHGetSpecialFolderLocation(0, aFolder, pIIL));
  SHGetPathFromIDList(pIIL, szPath);
  OleCheck(SHGetMalloc(aMalloc));
  aMalloc.Free(pIIL);
  Result:= szPath;
end;

function GetTempDir: string;
var
  tempFolder: array[0..Max_Path] of char;
begin
  GetTempPath(Max_Path - 1, @tempFolder);
  Result:= StrPas(tempFolder);
end;

function Vista: boolean;
begin
  Result := SysUtils.Win32MajorVersion >= 6;
end;

function GetProgramFilesVerz: string;
const
  CSIDL_PROGRAM_FILES = $0026;
var
  Reg: TRegistry;
  v, S, u: string;
begin
  if Vista then
    Result := IncludeTrailingPathDelimiter(GetShellFolderPath(CSIDL_PROGRAM_FILES))
  else
  begin
    v := 'C:\xxxx\';
    S := 'SOFTWARE\Microsoft\Windows\CurrentVersion';
    u := 'ProgramFilesDir';
    Reg := TRegistry.Create;
    try
      with Reg do
      begin
        RootKey := HKey_LOCAL_MACHINE;
        if KeyExists(s) then
        begin
          OpenKey(s, false);
          if ValueExists(u) then
            v := IncludeTrailingPathDelimiter(ReadString(u));
          closeKey;
        end;
      end;
    finally
      Reg.Free;
      Result := v;
    end;
  end;
end;
Delphi-Quellcode:
  VerzE:= GetProgramFilesVerz + 'xxxx\';

  VerzA:= IncludeTrailingPathDelimiter(GetShellFolderPath(CSIDL_APPDATA) + 'xxxx\';

  VerzT:= IncludeTrailingPathDelimiter(GetTempDir) + 'xxxx\';

  VerzP:= IncludeTrailingPathDelimiter(GetShellFolderPath(CSIDL_PERSONAL)) + 'xxxx\';

  if Vista then
    VerzB:= IncludeTrailingPathDelimiter(GetShellFolderPath(CSIDL_COMMON_APPDATA)) + 'xxxx\'
  else
    VerzB:= IncludeTrailingPathDelimiter(GetShellFolderPath(CSIDL_PERSONAL)) + 'xxxxBackUp\';
Kurze Abschlussfrage: In welches Verzeichnis schreibt Ihr denn die UnInstall.exe hin?

jaenicke 8. Jun 2012 11:32

AW: Das Programm wurde eventuell nicht richtig installiert.
 
Selbst habe ich das noch nie gemacht, dafür gibts ja Setupprogramme. :mrgreen:

Die machen das unterschiedlich, aber eigentlich gehört das mit unter CSIDL_PROGRAM_FILES und muss sich dann bei der Deinstallation natürlich auch selbst wieder löschen.

Das Verzeichnis wiederum sollte nur gelöscht werden, wenn es a) leer ist (falls der Benutzer dort Daten abgelegt hat) und b) beim Installieren erstellt wurde (falls der Benutzer z.B. sowas wie ein ansonsten leeres Systemverzeichnis angegeben hat). Das heißt du müsstest dir am besten in den Uninstalldaten auch speichern welche Verzeichnisse es schon vorher gab und welche du angelegt hast.

Bjoerk 8. Jun 2012 12:35

AW: Das Programm wurde eventuell nicht richtig installiert.
 
Okay, Danke. Ich lösche die Verzeichnisse nicht, sondern leere sie und auch nicht rekursiv und auch nur die von mir erstellten Unterverzeichnisse. Die Uninstall lösche ich nicht (den Trick mit der Batchdatei mag ich überhaupt nicht) kann aber auch nicht mehr ausgeführt werden.

Gruß
Tho

jaenicke 8. Jun 2012 12:46

AW: Das Programm wurde eventuell nicht richtig installiert.
 
Zitat:

Zitat von Bjoerk (Beitrag 1170021)
Die Uninstall lösche ich nicht (den Trick mit der Batchdatei mag ich überhaupt nicht) kann aber auch nicht mehr ausgeführt werden.

Noch schlimmer ist aber zweifelsohne die Datei einfach liegen zu lassen. Unsauberer gehts ja für nen Setup kaum noch.

Davon abgesehen gibt es ja auch andere Möglichkeiten. Eintrag in der Aufgabenplanung, Eintrag in der Registry in RunOnce, dann muss man den Uninstaller aber vorher in ein beschreibbares Verzeichnis schieben (z.B. Temp), ...

Dalai 8. Jun 2012 13:30

AW: Das Programm wurde eventuell nicht richtig installiert.
 
@Bjoerk: Wieso liest du - mit obigem Code aus #19 - auf Windows-Versionen vor Vista die Registry aus, um das Programme-Verzeichnis zu ermitteln? Die Funktion SHGetSpecialFolderPath funktioniert seit Win2k und ist dort auch die bevorzugte; ab Vista sollte man dann SHGetFolderPath oder gleich die neuste Inkarnation SHGetKnownFolderPath benutzen. Das Auslesen der Registry für solche Zwecke ist in jedem Fall "bäh".

MfG Dalai

Bjoerk 8. Jun 2012 14:09

AW: Das Programm wurde eventuell nicht richtig installiert.
 
Ja, da gebe ich dir Recht, das ist nicht besonders prickelnd. Das Ändere ich auf >= XP. Auf alle Fälle erst mal danke für euer Feedback. Ich denke, in Zukunft mache ich das auch besser über Innosetup.

jaenicke 8. Jun 2012 16:43

AW: Das Programm wurde eventuell nicht richtig installiert.
 
SHGetSpecialFolderPath gab es sogar schon bei Windows 95, vorausgesetzt man hatte den Internet Explorer von 3 auf 4 aktualisiert. ;-)
Und SHGetFolderPath gab es immer seit Windows 95.

Das mit der Registry war nur eine Idee aus der Beta von Windows 95, aber da schon 3 Programme oder so darauf zugriffen, hat man es dort stehen lassen und immer mit aktualisiert. Sonst hätten die Programme in der Final nicht mehr funktioniert. Heute dürfte man diese Entscheidung bei Microsoft bitter bereuen, wenn man sich anschaut wie verbreitet sich dieser Fehler hat (denn gedacht ist dafür ja die API...). ;-)


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:33 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz