![]() |
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 |
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. |
AW: Das Programm wurde eventuell nicht richtig installiert.
Zitat:
Lösung: Entweder einen Eintrag in der Systemsteuerung erzeugen oder dein Anwendungsmanifest anpassen ;-) |
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; |
AW: Das Programm wurde eventuell nicht richtig installiert.
Die Meldung kommt nur, wenn von CD installiert wird!? :gruebel:
|
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? |
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\ |
AW: Das Programm wurde eventuell nicht richtig installiert.
Umlaute/komischen Zeichensatz im Manifest?
|
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; |
AW: Das Programm wurde eventuell nicht richtig installiert.
Versuch es mal so:
![]() |
AW: Das Programm wurde eventuell nicht richtig installiert.
Registry.Create(KEY_ALL_ACCESS OR KEY_WOW64_64KEY) funktioniert bei mir nicht. :wall:
|
AW: Das Programm wurde eventuell nicht richtig installiert.
Welcher Fehler tritt denn auf?
|
AW: Das Programm wurde eventuell nicht richtig installiert.
Delphi-Quellcode:
wird nicht erkannt.
OpenKey('SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\...', false)
|
AW: Das Programm wurde eventuell nicht richtig installiert.
Dann kann ich Dir leider nicht weiterhelfen, ich habe hier kein Win64 :(
|
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: |
AW: Das Programm wurde eventuell nicht richtig installiert.
Zitat:
Dies funktioniert bei mir einwandfrei:
Delphi-Quellcode:
Die Variablen sRegKey, _bIsWow64 (bzw. deren Werte) kommen dabei von außen.
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 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 |
AW: Das Programm wurde eventuell nicht richtig installiert.
Zitat:
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? |
AW: Das Programm wurde eventuell nicht richtig installiert.
Zitat:
MfG Dalai |
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:
Kurze Abschlussfrage: In welches Verzeichnis schreibt Ihr denn die UnInstall.exe hin?
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\'; |
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. |
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 |
AW: Das Programm wurde eventuell nicht richtig installiert.
Zitat:
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), ... |
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 |
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.
|
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 00:20 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz