Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Probleme mit Try Ecxept und ShellExecute (https://www.delphipraxis.net/59908-probleme-mit-try-ecxept-und-shellexecute.html)

derzwent 30. Dez 2005 13:02


Probleme mit Try Ecxept und ShellExecute
 
Hallo allerseits,
habe da folgendes Problem: Ich möchte meine Programme (in diesem Fall Thunderbird und Firefox) über
jeweils eine Checkbox auswählen und durch ButtonClick öffnen.
Da aber das Thunderbird in einer mit TrueCrypt verschlüsselten Festplatte (Drive X) liegt, muß ich diese zuvor mit TrueCrypt mounten.
Mit Try Ecxept möchte ich nun erreichen, daß sich Thunderbird sofort öffnet, falls 'X' schon gemountet ist. Wenn 'X' allerdings nicht gemountet ist, soll sich TrueCrypt öffnen und nach dem mounten dann Thunderbird.

Hier nun mein Quellcode:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);

begin
        if
         CheckBox1.Checked then
          shellexecute (handle, 'open', 'C:\Programme\Mozilla Firefox\Firefox.exe', nil, nil, sw_shownormal);

        if
         CheckBox2.Checked then
         begin
          try
           shellexecute (handle, 'open', 'X:\Thunderbird\Thunderbird.exe', nil, nil, sw_shownormal);
          except
           shellexecute (handle, 'open', 'C:\Programme\TrueCrypt\TrueCrypt.exe', nil, nil, sw_shownormal);
          end;
         end;
Ich hoffe ihr könnt mir da mal helfen.
Danke schonmal.
P.S. Bin noch blutigster Anfänger! :pale:

[edit=Sharky]Quoting-Tags durch Delphi-Tags ersetzt. Mfg, Sharky[/edit]

Luckie 30. Dez 2005 13:06

Re: Probleme mit Try Ecxept und ShellExecute
 
Shellexecute wirft, wie jede API Funktion keine Exception:
Zitat:

Returns a value greater than 32 if successful, or an error value that is less than or equal to 32 otherwise. The following table lists the error values. The return value is cast as an HINSTANCE for backward compatibility with 16-bit Windows applications. It is not a true HINSTANCE, however. The only thing that can be done with the returned HINSTANCE is to cast it to an int and compare it with the value 32 or one of the error codes below.
Näheres dazu im MSDN: MSDN-Library durchsuchenShellexecute.

jbg 30. Dez 2005 13:10

Re: Probleme mit Try Ecxept und ShellExecute
 
Das Problem liegt wohl darin, dass ShellExecute (ja das schreibt man so, in C/C++/C#/Java wärst du aufgeschmissen mit der Kleinschreibnung) keine Exception wirft, wenn das Programm nicht gestartet wurde, sondern im Fehlerfall einen Wert kleiner als 32 zurückliefert, den du auswerten musst (mehr Infos siehe Win32API Hilfe). Das try/except ist hier also unnötig, da es hier nichts bringt.

derzwent 30. Dez 2005 13:14

Re: Probleme mit Try Ecxept und ShellExecute
 
Wie kann ich das Problem denn lösen?

tomsel 30. Dez 2005 13:23

Re: Probleme mit Try Ecxept und ShellExecute
 
Zitat:

Wie kann ich das Problem denn lösen?
Zitat:

...sondern im Fehlerfall einen Wert kleiner als 32 zurückliefert, den du auswerten musst...

Klaus01 30. Dez 2005 13:59

Re: Probleme mit Try Ecxept und ShellExecute
 
sollte in etwa so gehen ...

Delphi-Quellcode:
begin
  {$I-}
     shellexecute (handle, 'open', 'X:\Thunderbird\Thunderbird.exe', nil, nil, sw_shownormal);
  {$I+}
  if IOResult <= 32 then
    begin
      shellexecute (handle, 'open', 'C:\Programme\TrueCrypt\TrueCrypt.exe', nil, nil, sw_shownormal);

    end

end;
Grüße
Klaus

faux 30. Dez 2005 14:02

Re: Probleme mit Try Ecxept und ShellExecute
 
Es gibt im Prinzip zwei möglichkeiten:
1. Du überprüfst, ob die Datei existiert (file_exists('X:\Thunderbird\Thunderbird.exe')) oder
2. Du fragst den Wert, der per ShellExecute zurückgegeben wird ab, und wertest diesen aus. Ist er kleiner oder gleich 32, so gabs nen fehler.

Ich würde die 1. Methode bevorzugen.

Grüße
Faux

ManuMF 30. Dez 2005 16:57

Re: Probleme mit Try Ecxept und ShellExecute
 
Delphi-Quellcode:
if (ShellExecute(...) <= 32) then
  RaiseLastOSError;
für eine Standard-Meldung.
Alternativ kann der Fehler auch mit "case ShellExecute of ..." ausgewertet werden.

Gruß,
ManuMF

PierreB 30. Dez 2005 17:08

Re: Probleme mit Try Ecxept und ShellExecute
 
Zitat:

Die Funktion ShellExecute gibt bestimmte ErrorCodes zurück, wenn beim Starten der Anwendung Fehler auftreten. Diese Liste gibt eine Übersicht der möglichen Fehlerquellen und gibt verständliche Fehlermeldungen zurück. Als Parameter muss der ErrorCode übergeben werden
Delphi-Quellcode:
Function ShellExecuteErrMessage(int_Code: INTEGER): STRING;
 //Gibt die passenede Fehlermeldung zum ShellExecute Fehlercode zurück
Begin
  CASE int_code OF
     0: result := 'Zuwenig Speicher, ausführbare Datei war zerstört, Relokationswerte waren ungültig';
     2: result := 'Datei wurde nicht gefunden.';
     3: result := 'Verzeichnis wurde nicht gefunden.';
     5: result := 'Fehler beim gemeinsamen Zugriff auf eine Datei im Netz oder Fehler beim Zugriff auf eine gesperrte Datei im Netz.';
     6: result := 'Bibliothek forderte separate Datensegmente für jede Task an.';
     8: result := 'Zuwenig Speicher, um die Anwendung zu starten.';
    10: result := 'Falsche Windows-Version.';
    11: result := 'Ungültige ausführbare Datei. Entweder keine Windows-Anwendung oder Fehler in der EXE-Datei.';
    12: result := 'Anwendung für ein anderes Betriebssystem.';
    13: result := 'Anwendung für MS-DOS 4.0.';
    14: result := 'Typ der ausführbaren Datei unbekannt.';
    15: result := 'Versuch, eine Real-Mode-Anwendung (für eine frühere Windows-Version) zu laden.';
    16: result := 'Versuch, eine zweite Instanz einer ausführbaren Datei mit mehreren Datensegmenten die nicht als nur lesbar gekennzeichnet waren, zu laden.';
    19: result := 'Versuch, eine komprimierte ausführbare Datei zu laden.' + #13 + 'Die Datei muß dekomprimiert werden, bevor sie geladen werden kann.';
    20: result := 'Ungültige dynamische Linkbibliothek (DLL).' + #13 + 'Eine der DLLs, die benötigt wurde, um die Anwendung auszuführen, war beschädigt.';
  ELSE
    result := 'Ein Unbekannter Fehler ist aufgetreten. (' + IntToStr(int_code) + ')';
  END;
End;
So könnte man die Funktion aufrufen:
Delphi-Quellcode:
uses ShellApi;

procedure TForm1.FormCreate(Sender: TObject);
var
  Err: Integer;
begin
  Err:= ShellExecute(0,
               Nil,
               PChar('C:\Programm.exe'),
               Pchar('-Parameter'),
               Pchar('C:\StartDir'),
               SW_NORMAL);
  if Err<>0 then
    Showmessage(ShellExecuteErrMessage(Err));
end;

Quelle: Easy Delphi Helper
Vielleicht hilft es dir ja bei der Auswertung. ;)

faux 30. Dez 2005 17:45

Re: Probleme mit Try Ecxept und ShellExecute
 
@Pierre's Code:
Ich verstehe da zwei Dinge nicht ganz:
1. Wenn der Befehl funktioniert hat, dann ist der Wert doch größer 32. Dein Code gibt aber in diesem Fall einen unbekannten Fehler aus.

2. Wieso überprüfst du im Anwendungsbeispiel, ob der Fehler ungleich 0 ist? Das wäre ja laut deinem anderem Code "zu wenig Speicher"? :?

Grüße
Faux


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:18 Uhr.
Seite 1 von 2  1 2      

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