Delphi-PRAXiS
Seite 2 von 3     12 3      

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 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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:02 Uhr.
Seite 2 von 3     12 3      

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