Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi ShellExecute Fehler Unterdrücken (https://www.delphipraxis.net/139656-shellexecute-fehler-unterdruecken.html)

Billi Berserker 2. Sep 2009 11:04


ShellExecute Fehler Unterdrücken
 
Folgendes Problem:
Wenn ShellExecute auf eine Datei aufgerufen wird die nicht existiert gibt es den Fehler "ERROR_FILE_NOT_FOUND" zurück. Soweit ok, aber leider wird zusätzlich diese bescheuerte Error MessageBox angezeigt "Windows cannot find...". Gibte es eine Möglichkeit diese Fehlermeldung zu unterdrücken?

Bereits versucht habe ich:
  • SetErrorMode(SEM_FAILCRITICALERRORS or SEM_NOOPENFILEERRORBOX);
  • Try/Except
  • 0 als hwnd Parameter
Geht alles nicht :(

Falls jemand noch eine Idee hat oder das gleiche Problem schonmal hatte wäre ich sehr für Tipps dankbar.


ps. bitte keine extra klugen FileExists() vorschläge, es geht hier um einen 32/64bit bug in ShellExecute der durch brute force ausprobieren gelöst werden muss. Sprich der ShellExecute aufruf lässt sich nicht verhindern oder vorher überprüfen - die Fehlermeldung muss einfach nur weg.

DeddyH 2. Sep 2009 12:09

Re: ShellExecute Fehler Unterdrücken
 
Was für eine Datei wird denn da übergeben und auf welchem OS? Bei mir kommt keine Fehlermeldung (Vista Business 32 Bit).

Billi Berserker 2. Sep 2009 12:20

Re: ShellExecute Fehler Unterdrücken
 
lnk Dateien auf 64bit Vista und Win7 die auf 64bit Anwendungen zeigen welche sich in den entsprechenden 64bit Verzeichnissen befinden.
Z.b. wird Chess.lnk aus dem Startmenu auf ProgramFiles(x86) resolved obwohl es sich in ProgramFiles befindet. (jeweils wenn man den link resolve selber macht oder den ganzen link an ShellExecute gibt). Also versucht ShellExecute das Programm in ProgramFiles(x86) zu starten, findet es nicht und zeigt natürlich den Fehler.

Was ich jetzt grad noch versuche ist das ganze mit ShellExecuteEx zu machen. Das hat angeblich nen entsprechenden Flag um den Fehler zu unterbinden. Funktioniert natürlich nicht...
Delphi-Quellcode:
 
var
  Sei: TShellExecuteInfo;
begin
   FillChar(Sei, SizeOf(Sei), #0);
    with Sei do
    begin
      cbSize := SizeOf(Sei);
      fMask := SEE_MASK_FLAG_NO_UI;
      lpFile := PChar(AFileName);
      lpParameters := PCharOrNil(AParams);
      lpVerb := '';
      lpDirectory := PCharOrNil(ADefaultDir);
      nShow := SW_SHOWNORMAL;
    end;
    ShellExecuteEx(@Sei);
end;
Die Fehlermeldung kommt natürlich trotzdem. Falls da vielleicht jemand ne Idee hat...

DeddyH 2. Sep 2009 12:23

Re: ShellExecute Fehler Unterdrücken
 
Leider steht mir kein 64 Bit-OS zur Verfügung, so dass ich das nicht nachvollziehen kann :(

Billi Berserker 2. Sep 2009 12:27

Re: ShellExecute Fehler Unterdrücken
 
Auf 64bit werden Programme in 2 Verzeichnisse sortiert
ProgramFiles (x86) -> für 32bit Anwendungen
ProgramFiles -> für 64bit Anwendungen
Wenn man jetzt nen Link hat der auf %ProgramFiles%\Irgendwas.exe zeigt dann wird %ProgramFiles% von ShellLinkResolve oder ShellExecute falsch aufgelößt. Nämlich immer in die 32bit Version wenn man es von einer 32bit Anwendung aufruft.

Bernhard Geyer 2. Sep 2009 12:34

Re: ShellExecute Fehler Unterdrücken
 
%ProgramFiles% ist eine Umgebungsvariable. Hier müsstest du also auf einem 64-Bit System diesen Wert (kurzfristig) mit dem Pfad "C:\Program Files" überschreiben und dann wieder zurücksetzen. ShellExecute wertet hier scheinbar die Umgebungsvariablen des aufrufenden Prozesses auf.

Billi Berserker 2. Sep 2009 13:43

Re: ShellExecute Fehler Unterdrücken
 
Sowas wollte ich halt vermeiden, ich hab schon ne andere Lösung gefunden (.NET wrapper anwendung). Jedoch muß ich dafür trotzdem die Fehlermeldung unterdrücken um erstmal soweit zu kommen um zu sagen "ok das ist wieder so ein fall wo ShellExecute mist macht".

Progman 2. Sep 2009 14:46

Re: ShellExecute Fehler Unterdrücken
 
Theoretisch müsste es doch genügen, vor ShellExecute mit FileExists zu prüfen und nur wenn die Datei auch vorhanden ist, Shellexecute aufzurufen. So handhabe ich das.

Bernhard Geyer 2. Sep 2009 14:49

Re: ShellExecute Fehler Unterdrücken
 
Zitat:

Zitat von Progman
Theoretisch müsste es doch genügen, vor ShellExecute mit FileExists zu prüfen und nur wenn die Datei auch vorhanden ist, Shellexecute aufzurufen. So handhabe ich das.

Dumm ist nur das du als Delphi 32-Bit Prozess das Verzeichnis "C:\Program Files (x86)" untergeschoben bekommst und die Datei ja unter "C:\Program Files" exisitert. Siehe Post #5

Billi Berserker 2. Sep 2009 14:56

Re: ShellExecute Fehler Unterdrücken
 
Hab grad noch die letzten Stunden damit rum probiert und immernoch keine Möglichkeit gefunden die Fehlermeldung zu unterdrücken. Der Fehler kommt wahrscheinlich intern von ShellExecute. Der 'SEE_MASK_FLAG_NO_UI' Flag von ShellExecuteEx() scheint hier definitiv nicht zu funktionieren.
Wird mir wohl nichts anderes übrig bleiben als vorher noch irgendwelche Handstände zu machen.
Den link per Hand resolven und dann das Target überprüfen. Hat er kein Target (sprich GUID bzw. link auf Netzwerbverbindung, etc.) dann stur an ShellExecute übergeben, ansonsten unabhängig vom Target (so lange vorhanden) an den 64bit .NET link launcher übergeben (der auch nix anderes macht als den link zu resolven und auszuführn, nur halt in 64bit).
Was ein Krampf wieder :(

Das ist dann die zweite Geschichte wo ich mir für brauchbare 64bit support ne seperate Anwendung in C# bauen muss weil Delphi immernoch keinen 64bit Compiler hat.


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