AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi ShellExecute Fehler Unterdrücken
Thema durchsuchen
Ansicht
Themen-Optionen

ShellExecute Fehler Unterdrücken

Ein Thema von Billi Berserker · begonnen am 2. Sep 2009 · letzter Beitrag vom 2. Sep 2009
Antwort Antwort
Billi Berserker
(Gast)

n/a Beiträge
 
#1

ShellExecute Fehler Unterdrücken

  Alt 2. Sep 2009, 12:04
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.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.622 Beiträge
 
Delphi 12 Athens
 
#2

Re: ShellExecute Fehler Unterdrücken

  Alt 2. Sep 2009, 13:09
Was für eine Datei wird denn da übergeben und auf welchem OS? Bei mir kommt keine Fehlermeldung (Vista Business 32 Bit).
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Billi Berserker
(Gast)

n/a Beiträge
 
#3

Re: ShellExecute Fehler Unterdrücken

  Alt 2. Sep 2009, 13:20
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...
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.622 Beiträge
 
Delphi 12 Athens
 
#4

Re: ShellExecute Fehler Unterdrücken

  Alt 2. Sep 2009, 13:23
Leider steht mir kein 64 Bit-OS zur Verfügung, so dass ich das nicht nachvollziehen kann
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Billi Berserker
(Gast)

n/a Beiträge
 
#5

Re: ShellExecute Fehler Unterdrücken

  Alt 2. Sep 2009, 13:27
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.
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.195 Beiträge
 
Delphi 10.4 Sydney
 
#6

Re: ShellExecute Fehler Unterdrücken

  Alt 2. Sep 2009, 13:34
%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.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Billi Berserker
(Gast)

n/a Beiträge
 
#7

Re: ShellExecute Fehler Unterdrücken

  Alt 2. Sep 2009, 14:43
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".
  Mit Zitat antworten Zitat
Progman

Registriert seit: 31. Aug 2007
Ort: 99974 MHL
695 Beiträge
 
Delphi 10.1 Berlin Starter
 
#8

Re: ShellExecute Fehler Unterdrücken

  Alt 2. Sep 2009, 15:46
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.
Karl-Heinz
Populanten von Domizilen mit fragiler, transparenter Aussenstruktur sollten sich von der Translation von gegen Deformierung resistenter Materie distanzieren!
(Wer im Glashaus sitzt sollte nicht mit Steinen werfen)
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.195 Beiträge
 
Delphi 10.4 Sydney
 
#9

Re: ShellExecute Fehler Unterdrücken

  Alt 2. Sep 2009, 15:49
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
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Billi Berserker
(Gast)

n/a Beiträge
 
#10

Re: ShellExecute Fehler Unterdrücken

  Alt 2. Sep 2009, 15:56
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.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:42 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