![]() |
"Externer Prozess nicht möglich" bei ShellExecuteEx, Win11
Hallo,
ich bekomme beim Aufruf einer Bat-Datei per ShellExecuteEx unter Win11 die obige Fehlermeldung. Aber nur an einem einzigen Rechner. Und klar ist das ein Kunden-Rechner ... ;( Ich habe den Windows Defender im Verdacht, ein externer Virenscanner ist nicht drauf. Ich finde aber keine Einstellung für geblockte Programme nicht. Irgendwie hat sich auch die ganze Oberfläche bei Win11 nat. wieder geändert ... Hat jemand einen Tipp für mich? PS: Das Programm selbst läuft ohne Probleme. Auch der Start z.B. von gbak (Backup-Programm von Firebird) klappt. |
AW: "Externer Prozess nicht möglich" bei ShellExecuteEx, Win11
Google liefert keinen einzigen Treffer für "externer prozess nicht möglich".
Bist du dir sicher dass das die Fehlermeldung ist? Noch besser wäre der Rückgabewert von
Delphi-Quellcode:
, dann müsste man nicht erst Textbausteine rückübersetzen und zu Fehlercodes zuordnen...
ShellExecuteEx()
Falls du den Rückgabewert im Fehlerfall nicht mitloggst kann man vlt. im Windows Event Log etwas finden. |
AW: "Externer Prozess nicht möglich" bei ShellExecuteEx, Win11
Hallo,
stimmt, eines der Eventlogs müsste den haben. Danke |
AW: "Externer Prozess nicht möglich" bei ShellExecuteEx, Win11
Hallo,
toll, Fehlermeldung wurde von uns "erfunden"
Delphi-Quellcode:
Und nein, nat. wird GetLastError nicht ausgewertet und angezeigt oder geloggt ...
if CreateProcess then
begin end else begin MessageBox(.. "externer Prozess nicht möglich"); end; |
AW: "Externer Prozess nicht möglich" bei ShellExecuteEx, Win11
Normalerweise schreibt man dann aber „Es ist ein Fehler aufgetreten“, so dass man gleich weiß, dass man an der Stelle geschlampt hat <sarcasm off>.
|
AW: "Externer Prozess nicht möglich" bei ShellExecuteEx, Win11
Zitat:
GetLastErrorCode schon ausgewertet? Das ist bei sowas zwingend abzufragen. Am besten im Programm in Logdatei schreiben lassen, falls man die Nummer dem Anwender nicht zumutet. |
AW: "Externer Prozess nicht möglich" bei ShellExecuteEx, Win11
Ist das nun der Fehlercode von ShellExecute, oder kommt der Fehler in der Batch?
OK, sowas macht man natürlich nicht. GetLastError, SysErrorMessage, RaiseLastOSError und dann Fehlercode mit Nummer, Text und einem Zusatztext, damit man weiß wo im Programm (wenn man nicht schon Fehlerdialog mit Debuginfos hat) Fehlerbehandlung mit MessageBoxen ist eh total krank, da man dort nicht mit TryFinally arbeiten kann. Statt .BAT ein .CMD probiert? :freak: CreateProcess statt ShellExecute. .... Ist das Programm unsigniert oder hat "böse" Wörter im Namen (setup usw.), bzw. wie heißt die Batch? Echt mal, warum kommt niemand auf die Idee den ErrorCode mit auszugeben? Oder schaut selber nach, welcher Fehler das ist und gibt eine suchbare Bezeichnung an? Der engliche Text oder den Name der Konstante, so ala ERROR_NO_PROC_SLOTS. "geht nicht" oder einfach ein TerminateProcess als Reaktion, reicht vollkommen aus, wenn man sowieso zu nix Lust hat. (Letzteres macht Eurekalog und Co. auch gern, wenn ihnen was nicht gefällt) |
AW: "Externer Prozess nicht möglich" bei ShellExecuteEx, Win11
Hallo,
nat. ist die Exe signiert (extended val.). pah ;) GetLastError, und der ganze andere Kram, pah OK, mein Vorgänger kannte das nicht wirklich ... Zitat:
Nein, im Ernst, es zeigt wieder. Aufruf fremden Codes komplett kapseln. jaja, olle Besserwisser ;) |
AW: "Externer Prozess nicht möglich" bei ShellExecuteEx, Win11
Och, kapseln ist nicht unbedingt nötig, aber eine gute Fehlerbehandlung (ordentliche Auswertung aller Rückgabewerte) ist Gold wert.
Hätte man aber vorher die Fehlerbehandlung halbwegs richtig gemacht, dann hätte man jetzt mehr Infos ... gerade weil es ein Kundensystem ist und ihr in dem Moment nicht davor sitzt. :zwinker: |
AW: "Externer Prozess nicht möglich" bei ShellExecuteEx, Win11
Delphi-Quellcode:
if not CreateProcess(...) then
RaiseLastOSError; // das Minimum, was man nach Belieben ausbauen kann ...
Delphi-Quellcode:
if not CreateProcess(...) then begin
Err := GetLastError; //raise Exception.CreateFmt('irgendwas: %d %s', [Err, SysErrorMessage(Err)]); E := EOSError.Create('irgendwas: ' + SysErrorMessage(Err)); E.ErrorCode := Err; // ja, ist irgendwie total krank, dass Borland/Codegear/Embarcadero seit Jahrzehnten die passenden überladenen Contructoren vergessen hat. raise E; end; ... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19: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