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 External execption EEFFACE bei ShellExecuteEx (https://www.delphipraxis.net/121232-external-execption-eefface-bei-shellexecuteex.html)

gkoeder 24. Sep 2008 10:12


External execption EEFFACE bei ShellExecuteEx
 
Hallo!

Ich habe hier ein merkwürdiges und ziemlich nerviges Problem mit dem Befehl ShellExecuteEx. Die Implementierung sieht folgendermaßen aus:

Delphi-Quellcode:
  function ShellExecEx(const FileName: string; const Parameters: string; const Directory: String; const Verb: string; CmdShow: Integer): Boolean;
  var
    Info: pShellExecuteInfo;
  begin
    // Clear Info
    New(Info);
    ZeroMemory(Info, SizeOf(TShellExecuteInfo));

    // Fill in the SHELLEXECUTEINFO structure
    try
      Info.cbSize :=           SizeOf(tShellExecuteInfo);
      Info.fMask :=            SEE_MASK_FLAG_NO_UI or SEE_MASK_DOENVSUBST;
      Info.wnd :=             HWnd_Desktop;
      Info.lpVerb :=           pChar(Pointer(Verb));
      Info.lpFile :=           pChar(FileName);
      Info.lpParameters :=     pChar(Pointer(Parameters));
      Info.lpDirectory :=      pChar(Pointer(Directory));
      Info.nShow :=            CmdShow;;
      Info.hInstApp :=         0;
      Info.lpIDList :=         nil;

      {$T+}
      Result := ShellExecuteEx(Info);
      {$T-}
      if Result = False then ShowMessage(SysErrorMessage(GetLastError));
    finally
      Dispose(Info);
    end;
  end;
Wenn ich nun eine Datei mit ShellExecuteEx starte (verb 'Open', cmdShow 'SW_SHOWNORMAL'), dann fährt mir sehr häufig die komplette IDE mit einer External Exception EEFFACE an die Wand. Ich kann dann nur noch bds.exe per Taskmanager beenden und neu starten (was das debuggen natürlich knifflig macht).
Ich hab die Routine in zwei Programmen im Einsatz und bei beiden hab ich das Problem - ich vermute also, dass es nicht am restlichen Programm liegt. Ebenso hab ich keine zusammenhänge bei den zu startenden Dateien erkennen können. Einmal klappt der Aufruf und ein andermal bekomme ich die Exception bei der selben Datei.
Die Exception wird direkt beim ShellExecuteEx-Aufruf ausgelöst.

Die Systemumgebung sieht folgendermaßen aus:
Delphi 2007 Pro mit allen aktuellen Fixpacks
Windows Vista Business

Also ich bin ziemlich ratlos (und nachdem ich die IDE die letzten Tage zahllos abgeschossen und wieder neu gestartet hab auch ziemlich frustiert). Hat jemand eine Idee, worin der Fehler liegen kann?

Gruß
Gerald

Fuchtel 24. Sep 2008 10:20

Re: External execption EEFFACE bei ShellExecuteEx
 
Hallo Gerald,

hat dein Aufrufendes Programm auch die Rechte, das andere zu Starten?

Oder verhindert irgendein Virenschutz, Fierwall, ... das starten?

Du weißt ja, Vista ist da sehr heikel!

Gruß Fuchtel

gkoeder 24. Sep 2008 10:26

Re: External execption EEFFACE bei ShellExecuteEx
 
Zitat:

Zitat von Fuchtel
Hallo Gerald,

hat dein Aufrufendes Programm auch die Rechte, das andere zu Starten?

Oder verhindert irgendein Virenschutz, Fierwall, ... das starten?

Du weißt ja, Vista ist da sehr heikel!

Gruß Fuchtel

Da sollte es keine Probleme geben. Ich hab vorzugsweise Textdateien getestet. Die werden mit dem Notepad bzw. emEditor geöffnet. Beides sind Programme, die im Usercontext eigentlich problemlos funktionieren.
Den Virenkiller (Kaspersky 2009) hab ich auch testweise abgeschaltet, da dieser über ein Behaviour-Blocking verfügt und so vllt Probleme verursacht. Gebracht hat es leider nichts :-(

Gruß
Gerald

DeddyH 24. Sep 2008 10:31

Re: External execption EEFFACE bei ShellExecuteEx
 
Ich weiß nicht, wie weit die Compilermagic das ausgleicht, aber mal sprichst Du Info als Pointer an und mal nicht. Ich würde das mal so abändern:
Delphi-Quellcode:
function ShellExecEx(const FileName: string; const Parameters: string; const Directory: String; const Verb: string; CmdShow: Integer): Boolean;
  var
    Info: TShellExecuteInfo;
  begin
    // Clear Info
//    New(Info);
    ZeroMemory(@Info, SizeOf(TShellExecuteInfo));

    // Fill in the SHELLEXECUTEINFO structure
//    try
      Info.cbSize :=           SizeOf(tShellExecuteInfo);
      Info.fMask :=            SEE_MASK_FLAG_NO_UI or SEE_MASK_DOENVSUBST;
      Info.wnd :=             HWnd_Desktop;
      Info.lpVerb :=           pChar(Pointer(Verb));
      Info.lpFile :=           pChar(FileName);
      Info.lpParameters :=     pChar(Pointer(Parameters));
      Info.lpDirectory :=      pChar(Pointer(Directory));
      Info.nShow :=            CmdShow;;
      Info.hInstApp :=         0;
      Info.lpIDList :=         nil;

      {$T+}
      Result := ShellExecuteEx(@Info);
      {$T-}
      if Result = False then ShowMessage(SysErrorMessage(GetLastError));
{    finally
      Dispose(Info);
    end;}
  end;

gkoeder 24. Sep 2008 11:04

Re: External execption EEFFACE bei ShellExecuteEx
 
Die erste Version der Funktion sah folgendermaßen aus:

Delphi-Quellcode:
function ShellFileOpen(const aFile, aParameters, aDirectory: string): Boolean;
var
  Info: TShellExecuteInfo;
begin
  // Clear Info
  FillChar( Info, SizeOf( TShellExecuteInfo ), #0 );

  with Info do
  begin
    cbSize :=           SizeOf(Info);
    fMask :=            SEE_MASK_FLAG_NO_UI or SEE_MASK_NOCLOSEPROCESS;
    wnd :=             HWnd_Desktop;
    lpVerb :=           'open'; // RunAs startet den "Ausführen als .."-Dialog
    lpFile :=           pChar(aFile);
    if aParameters <> ''
    then lpParameters := pChar(aParameters)
    else lpParameters := NIL;
    if aDirectory <> ''
    then lpDirectory := pChar(aDirectory)
    else lpDirectory := Nil;
    nShow :=            SW_SHOWNORMAL;;
    hInstApp :=         0;
    lpIDList :=         nil;
  end;

  Result := ShellExecuteEx(@Info);
End;
Aber selbst hier gibts die selbe Exception beim ShellExecuteEx :-( Ich hab gestern die Funktionen an einer zweiten Maschine unter WinXP getestet und dort scheinen sie offensichtlich zu funktionieren. In der MSDN hab ich aber keine gravierenden Neuerungen von XP zu Vista bei ShellExecuteEx gefunden

Gruß
Gerald

DMW 25. Sep 2008 07:49

Re: External execption EEFFACE bei ShellExecuteEx
 
Zitat:

Zitat von gkoeder
Wenn ich nun eine Datei mit ShellExecuteEx starte (verb 'Open', cmdShow 'SW_SHOWNORMAL'), dann fährt mir sehr häufig die komplette IDE mit einer External Exception EEFFACE an die Wand. Ich kann dann nur noch bds.exe per Taskmanager beenden und neu starten (was das debuggen natürlich knifflig macht).

Bei Exceptions vom Typ "External Exception EEFFACE" handelt es sich um C++-Exceptions aus C++Builder, die Delphi nicht kennt und daher auch nicht angemessen behandeln kann. Einige Teile der IDE, AFAIK auch wesentliche Teile des Debuggers sowie die beiden Compiler, sind in C und C++ geschrieben; das dürfte zumindest die Herkunft der Exception begründen.

Derzeit arbeite ich an einer Unit, die Delphi-Programme in die Lage versetzt, C++Builder-Exceptions behandeln zu können. Ich könnte dir den Entwurf mal zuschicken, und du kannst ihn als DLL-Wizard in die IDE laden, so daß du eine ordentliche Fehlermeldung bekommst.

Einstweilen teste doch mal, ob die Option "Debug spawned processes" (irgendwo in "Tools|Debugger Options") etwas ändert.

gkoeder 26. Sep 2008 12:18

Re: External execption EEFFACE bei ShellExecuteEx
 
Zitat:

Zitat von DMW
...
Einstweilen teste doch mal, ob die Option "Debug spawned processes" (irgendwo in "Tools|Debugger Options") etwas ändert.

Danke für den Tipp! Ich schau mal, ob ich so dem Problem auf die schliche komme.

DMW 2. Okt 2008 11:57

Re: External execption EEFFACE bei ShellExecuteEx
 
Zitat:

Zitat von DMW
Derzeit arbeite ich an einer Unit, die Delphi-Programme in die Lage versetzt, C++Builder-Exceptions behandeln zu können. Ich könnte dir den Entwurf mal zuschicken, und du kannst ihn als DLL-Wizard in die IDE laden, so daß du eine ordentliche Fehlermeldung bekommst.

Eine etwas ausführlichere Behandlung des Themas findest du nun hier.


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