![]() |
Probleme auf neuem Rechner
Hallo zusammen,
ich habe mir vor kurzen einen neuen PC gekauft. Alter PC: Windows 10 Home Neuer PC: Windows 10 Pro Ich programmiere nun also auf dem neuen PC und arbeite weiter an einem Programm, was bereits auf dem alten PC fehlerfrei lief. Nun ergibt sich aber auf dem neuen PC ein mir völlig unversätndliches Problem. Mein Programm soll sich unter gewissen Umständen neu starten lassen. Dafür verwendete ich bisher immer folgenden Code:
Code:
Wenn ich nun aber einen Neustart durchführen will, dann passiert (nur auf meinem neuen PC, trotz des selben Codes) einfach nichts. Keine Fehlermeldung, keine Reaktion, einfach überhaupt nichts. Auf meinem alten Rechner funktioniert der Neustart immer noch problemlos.
form1.close;
ShellExecute(Handle, 'open',PChar(Application.ExeName), nil, nil, 0); Kann mir einer von euch erklären, wie das passieren kann? Wie kann ich das Problem beheben? Vielen Dank und LG |
AW: Probleme auf neuem Rechner
Ich denke das ist pures Glück, dass es auf dem alten PC funktioniert.
Der neue macht meiner Meinung nach genau das was zu erwarten ist. Du sagst deinem Programm es soll sich schließen und erst danach ruft es sich selber wieder auf. Pures Glück wenn das mal klappt. Einen Neustart realisiert man am besten anders aber nicht so. |
AW: Probleme auf neuem Rechner
Zitat:
|
AW: Probleme auf neuem Rechner
.. mormalerweise hat man für diese Art von Problemen einen Watcher Prozess.
Dieser überwacht das Programm und startet es bei Bedarf wieder neu. Grüße Klaus |
AW: Probleme auf neuem Rechner
Oder man ruft ShellExecute im FormDestroy auf. So spät wie möglich.
|
AW: Probleme auf neuem Rechner
Zitat:
Aber das was du da machst, ist in etwa so, also ob du erst dich erschießt und danach die Geisel erschießen willst. Ok, das war jetzt etwas makaber. Davon abgesehen lässt sich so ein Programm nie sauber beenden, wenn es keine andere Möglichkeit gibt es zu beenden. |
AW: Probleme auf neuem Rechner
Le roi est mort, vive le roi
Sorry, es ist einfach zu heiss :roll: |
AW: Probleme auf neuem Rechner
Danke erstmal für eure Rückmeldung. Ich verstehe, dass ihr nicht zufrieden seid mit meiner Art den Neustart herbeizuführen. Ich werde mich da sicherlich auch nochmal intensiver mit beschäftigen. Mein Problem bleibt aber auch so bestehen:
Ich habe mal versucht ein anderes Programm per ShellExecute einfach aufzurufen ohne mein Programm zu schließen. Das sah so aus:
Code:
Die ausgewählte Datei funktionierte einwandfrei und lag auch am richtigen Ort mit dem richtigen Namen. Trotzdem passierte wieder nichts Sichtbares...
ShellExecute(Handle, 'open', PChar('C:\Datei.exe'), Nil, Nil, 1);
Vielleicht mache ich irgendetwas grundlegend falsch?! |
AW: Probleme auf neuem Rechner
Zitat:
|
AW: Probleme auf neuem Rechner
Zitat:
Ich glaube aber, dass ich mittlerweile einen Grund gefunden haben könnte. Ich habe mir (wie von euch empfohlen) von ShellExecute den Rückgabewert anzeigen lassen... Ergebnis: "The specified file was not found." Da ich aber das File korrekt angegeben habe, war ich verwirrt. Ich hab deshalb mal die .exe Datei in verschiedene Ordner gerückt und getestet. Dabei hab ich folgendes herausgefunden. Wenn die .exe im Ordner oder Unterordner meines Benutzernamens liegt, dann kann sie nicht gefunden werden. Wenn ich sie tatsächlich einfach nur nach C:/ lege, dann kann sie gefunden werden. Es hat also meiner Meinung nach etwas mit meinem Benutzernamen zu tun. Dieser hat leider ein Leerzeichen und ein Sonderzeichen in sich. Zwar nicht mein echter Name, aber in etwas sieht er so aus: "Max Müller". Mit dem Problem habe ich schon einmal auf dem neuen Rechner gekämpft. Dort wurde nämlich die EnvironmentVariable APPDATA, nicht in "C:\Users\Max Müller\AppData\Roaming" sondern in "C:\Users\Max MǬller\AppData\Roaming" oder in "C:\Users\Max Müller\AppData\Roaming" aufgelöst. Diese Orte konnten natürlich dann nicht gefunden werden. Gelöst habe ich das Problem damals, in dem ich die Zeichen "ü" und "Ǭ" manuell ersetzt habe. Ich habe deshalb jetzt mal mein Programm mit dem Neustart nach C:/ geschoben. Der Neustart funktioniert nun wieder. Das kann aber ja keine echt Lösung sein, da das Programm ja von jedem Speicherort aus laufen können sollte... Vielleicht helfen die Infos, damit mein Problem besser deutlich wird. Was kann ich tun, um dieses Problem zu beheben? |
AW: Probleme auf neuem Rechner
Ich kann dir bei dem Problem mit den Umlauten nicht helfen.
Aber lass das shellExecute unbedingt im FormDestroy. Andernfalls machst du nur das, was Luckie schreibt. |
AW: Probleme auf neuem Rechner
Welche Delphi Version verwendest du? Solltest du noch kein Unicode Delphi benutzen, ruf mal explizit ShellExecuteW mit PWideChar auf.
|
AW: Probleme auf neuem Rechner
Hallo,
Zitat:
Delphi-Quellcode:
ShellExecute(Handle, 'OPEN', PChar('"' + 'C:\Datei 2.txt' + '"'), nil, nil, 1);
Edit: Dateien sollte man im Root nicht speichern... |
AW: Probleme auf neuem Rechner
Zitat:
|
AW: Probleme auf neuem Rechner
Und wenn du dir die richtige Version des Pfades zuerst holst.
![]() |
AW: Probleme auf neuem Rechner
Danke für eure Antworten. Es war mir nun zu blöd mich noch länger damit zu ärgern.
Ich habe deshalb nun auf den Neustart verzichtet und eine andere Lösung gefunden. Trotzdem Vielen Dank für eure Hilfe :) |
AW: Probleme auf neuem Rechner
Herausfinden lässt sich das leicht über den
![]() Dort einfach den Filter setzen auf "Path" "contains" "<Name deiner Exe>". Dann solltest du sehen was dort schief geht. |
AW: Probleme auf neuem Rechner
Zitat:
Wieso verzeichtest du auf ein Feature, nur weil ein anderes, was damit zusammenhängt, nicht auf Anhieb funktioniert? Mit Delphi wäre das nicht passiert :roll: |
AW: Probleme auf neuem Rechner
Hallo zusammen,
ich denke das der einzige der das Problem hier richtig erkannt hat Jürgen ist: Zitat:
Delphi-Quellcode:
die Application weg sein soll muss mir mal jemand erklären.
form1.close;
Das ist nämlich definitiv nicht so. Die Application endet nicht einfach in einer Methode!!!!!! Die Application wird beendet nach einer PostQuitMessage. Damit wird dann die Messageloop beendet. Das hier fällt auf die Nase wenn Leerzeichen im Pfad sind.
Delphi-Quellcode:
deshalb in DoubleQuotes:
ShellExecute(Handle, 'open',PChar(Application.ExeName), nil, nil, 0);
Delphi-Quellcode:
ShellExecute(Handle, 'open',PChar(AnsiQuotedStr(Application.ExeName, '"')), nil, nil, 0);
und natürlich ist es hilfreich auf Fehler zu prüfen... |
AW: Probleme auf neuem Rechner
Das stimmt. Aber aussteigen und gleichzeitig wieder einsteigen wollen, ist auch in der Programmiernung problematisch.
|
AW: Probleme auf neuem Rechner
Zitat:
Du kannst das ja mal testen. Schreib ein showmessage in die Events OnClose, OnCloseQuery und OnDestroy. Ohne es getestet zu haben sollten alle Messageboxen bis OnDestroy durchlaufen bevor jemals ShellEcecute aufgerufen wird. |
AW: Probleme auf neuem Rechner
Zitat:
Es soll ein neuer Prozess gestartet werden (zufälligerweise die gleiche Anwendung wie die aktuell läuft). Der aktuelle Prozess soll beendet werden. Da es sich um zwei völlig voneinander unabhängige Prozesse handelt ist das ohne große Schwierigkeiten zu bewältigen. @DieDolly Wenn man die MainForm schließt, dann wird die Anwendung nicht hart beendet, sondern die Anwendung dümpelt da noch ein wenig herum und sendet lustig Nachrichten und beendet sich dann ganz sauber und kontrolliert. So funktioniert es mit Delphi 10.3.2 egal ob in einem Verzeichnis mit Leerzeichen oder ohne. Aber falls es nicht gestartet werden könnte, dann wird nun eine aussagekräftige Fehlermeldung ausgegeben.
Delphi-Quellcode:
Update:
var
ReturnValue: HINST; begin ReturnValue := ShellExecute(self.Handle, 'open', PChar(Application.ExeName), nil, nil, SW_SHOWNORMAL); if ReturnValue < 32 then RaiseLastOSError(); Application.MainForm.Close(); end; Beim Beenden der Anwendung auf so etwas wie ShowMessage zu setzen und daraus eine Schlußfolgerung zu ziehen ist sehr schlecht, denn auch dieser Dialog (aufgerufen von ShowMessage) bekommt eine Nachricht sich doch bitte wieder zu schließen, was dieser dann auch ohne zu zögern macht. Beispiel 1:
Delphi-Quellcode:
Leider wird hier weder ein Dialog angezeigt, noch ist dieser Aufruf blockierend (weil das Öffnen/Anzeigen quasi zeitgleich mit der Schließen-Anforderung erfolgt und wir nicht schnell genug schauen können, bzw. auch der Monitor zu träge ist).
procedure TForm1.Button1Click(Sender:TObject);
begin Application.MainForm.Close(); ShowMessage('Können Sie mich sehen?'); end; Beispiel 2:
Delphi-Quellcode:
Hier wird das Beenden der Anwendung sehr wohl um genau diese 5000 Millisekunden verzögert.
procedure TForm1.Button1Click(Sender:TObject);
begin Application.MainForm.Close(); Sleep(5000); end; Fazit: Es ist völlig egal, wo man den Prozess startet, ob vor oder nach dem
Delphi-Quellcode:
. Allerdings würde ich die aktuelle Anwendung/Prozess erst dann beenden, wenn ich den neuen Prozess erfolgreich starten konnte.
Application.MainForm.Close();
Denksport: Wer Lust hat kann sich ja mal überlegen, was hier passiert:
Delphi-Quellcode:
Allerdings sollte man erst raten, es dann ausprobieren und dann dafür eine Erklärung finden.
procedure TForm1.Button1Click(Sender:TObject);
begin Application.MainForm.Close(); ShowMessage('Können Sie mich sehen?'); Sleep(5000); end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:16 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