Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Probleme auf neuem Rechner (https://www.delphipraxis.net/201495-probleme-auf-neuem-rechner.html)

Rawsche 26. Jul 2019 11:28

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:
form1.close;
ShellExecute(Handle, 'open',PChar(Application.ExeName), nil, nil, 0);
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.

Kann mir einer von euch erklären, wie das passieren kann? Wie kann ich das Problem beheben?

Vielen Dank und LG

DieDolly 26. Jul 2019 11:44

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.

peterbelow 26. Jul 2019 11:48

AW: Probleme auf neuem Rechner
 
Zitat:

Zitat von Rawsche (Beitrag 1437717)
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:
form1.close;
ShellExecute(Handle, 'open',PChar(Application.ExeName), nil, nil, 0);
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.

Kann mir einer von euch erklären, wie das passieren kann? Wie kann ich das Problem beheben?

Vielen Dank und LG

Prüfe den Rückgabewert von ShellExecute!

Klaus01 26. Jul 2019 11:49

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

DieDolly 26. Jul 2019 11:49

AW: Probleme auf neuem Rechner
 
Oder man ruft ShellExecute im FormDestroy auf. So spät wie möglich.

Luckie 26. Jul 2019 13:12

AW: Probleme auf neuem Rechner
 
Zitat:

Zitat von peterbelow (Beitrag 1437720)
Prüfe den Rückgabewert von ShellExecute!

Das wird er nicht mehr können, da der aufrufende Prozess beendet wurde.

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.

jsp 26. Jul 2019 13:34

AW: Probleme auf neuem Rechner
 
Le roi est mort, vive le roi

Sorry, es ist einfach zu heiss :roll:

Rawsche 26. Jul 2019 13:48

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:
ShellExecute(Handle, 'open', PChar('C:\Datei.exe'), Nil, Nil, 1);
Die ausgewählte Datei funktionierte einwandfrei und lag auch am richtigen Ort mit dem richtigen Namen. Trotzdem passierte wieder nichts Sichtbares...

Vielleicht mache ich irgendetwas grundlegend falsch?!

DieDolly 26. Jul 2019 14:03

AW: Probleme auf neuem Rechner
 
Zitat:

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
Setz das Shellexecute ins FormDestroy und dann sollte alles funktionieren.

Rawsche 26. Jul 2019 14:23

AW: Probleme auf neuem Rechner
 
Zitat:

Zitat von DieDolly (Beitrag 1437735)
Zitat:

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
Setz das Shellexecute ins FormDestroy und dann sollte alles funktionieren.

Habe es gerade versucht. Hat leider keinen Effekt. Das Programm startet trotzdem nicht.

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?

DieDolly 26. Jul 2019 14:26

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.

Luckie 26. Jul 2019 14:42

AW: Probleme auf neuem Rechner
 
Welche Delphi Version verwendest du? Solltest du noch kein Unicode Delphi benutzen, ruf mal explizit ShellExecuteW mit PWideChar auf.

juergen 26. Jul 2019 15:16

AW: Probleme auf neuem Rechner
 
Hallo,

Zitat:

Zitat von Rawsche (Beitrag 1437736)
...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"

Ich vermute es liegt am Leerzeichen...

Delphi-Quellcode:
ShellExecute(Handle, 'OPEN', PChar('"' + 'C:\Datei 2.txt' + '"'), nil, nil, 1);


Edit: Dateien sollte man im Root nicht speichern...

Rawsche 27. Jul 2019 11:06

AW: Probleme auf neuem Rechner
 
Zitat:

Zitat von Luckie (Beitrag 1437739)
Welche Delphi Version verwendest du? Solltest du noch kein Unicode Delphi benutzen, ruf mal explizit ShellExecuteW mit PWideChar auf.

Ich benutze kein Delphi sondern Lazarus...

Ydobon 27. Jul 2019 11:23

AW: Probleme auf neuem Rechner
 
Und wenn du dir die richtige Version des Pfades zuerst holst. SHGetKnownFolderPath müsste doch auch Lazarus kennen.

Rawsche 27. Jul 2019 12:17

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 :)

jaenicke 27. Jul 2019 14:04

AW: Probleme auf neuem Rechner
 
Herausfinden lässt sich das leicht über den Process Monitor.
Dort einfach den Filter setzen auf "Path" "contains" "<Name deiner Exe>". Dann solltest du sehen was dort schief geht.

DieDolly 27. Jul 2019 15:25

AW: Probleme auf neuem Rechner
 
Zitat:

Danke für eure Antworten. Es war mir nun zu blöd mich noch länger damit zu ärgern.
Wie der eigentliche Neustart reibungslos funktioniert, habe ich dir zweimal geschrieben.

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:

Fritzew 27. Jul 2019 16:29

AW: Probleme auf neuem Rechner
 
Hallo zusammen,

ich denke das der einzige der das Problem hier richtig erkannt hat Jürgen ist:

Zitat:

Zitat von juergen (Beitrag 1437742)
Hallo,
Ich vermute es liegt am Leerzeichen...

Delphi-Quellcode:
ShellExecute(Handle, 'OPEN', PChar('"' + 'C:\Datei 2.txt' + '"'), nil, nil, 1);

Wieso nach
Delphi-Quellcode:
form1.close;
die Application weg sein soll muss mir mal jemand erklären.
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:
ShellExecute(Handle, 'open',PChar(Application.ExeName), nil, nil, 0);
deshalb in DoubleQuotes:

Delphi-Quellcode:
ShellExecute(Handle, 'open',PChar(AnsiQuotedStr(Application.ExeName, '"')), nil, nil, 0);

und natürlich ist es hilfreich auf Fehler zu prüfen...

Luckie 27. Jul 2019 17:34

AW: Probleme auf neuem Rechner
 
Das stimmt. Aber aussteigen und gleichzeitig wieder einsteigen wollen, ist auch in der Programmiernung problematisch.

DieDolly 27. Jul 2019 17:46

AW: Probleme auf neuem Rechner
 
Zitat:

Das ist nämlich definitiv nicht so.
Die Application endet nicht einfach in einer Methode!!!!!!
Ich behaupte was anderes.
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.

Schokohase 27. Jul 2019 17:58

AW: Probleme auf neuem Rechner
 
Zitat:

Zitat von Luckie (Beitrag 1437808)
Das stimmt. Aber aussteigen und gleichzeitig wieder einsteigen wollen, ist auch in der Programmiernung problematisch.

Mag sein, ist aber in diesem Fall völlig unerheblich.

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:
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;
Update:

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:
procedure TForm1.Button1Click(Sender:TObject);
begin
  Application.MainForm.Close();
  ShowMessage('Können Sie mich sehen?');
end;
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).

Beispiel 2:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender:TObject);
begin
  Application.MainForm.Close();
  Sleep(5000);
end;
Hier wird das Beenden der Anwendung sehr wohl um genau diese 5000 Millisekunden verzögert.

Fazit:

Es ist völlig egal, wo man den Prozess startet, ob vor oder nach dem
Delphi-Quellcode:
Application.MainForm.Close();
. Allerdings würde ich die aktuelle Anwendung/Prozess erst dann beenden, wenn ich den neuen Prozess erfolgreich starten konnte.

Denksport:
Wer Lust hat kann sich ja mal überlegen, was hier passiert:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender:TObject);
begin
  Application.MainForm.Close();
  ShowMessage('Können Sie mich sehen?');
  Sleep(5000);
end;
Allerdings sollte man erst raten, es dann ausprobieren und dann dafür eine Erklärung finden.


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:18 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