AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi ShellApiEx funzt aber Hauptprogramm stürzt ab (Einzeiler)
Thema durchsuchen
Ansicht
Themen-Optionen

ShellApiEx funzt aber Hauptprogramm stürzt ab (Einzeiler)

Ein Thema von Ajin · begonnen am 3. Nov 2006 · letzter Beitrag vom 28. Okt 2012
Antwort Antwort
Ajin

Registriert seit: 23. Feb 2006
Ort: Mons
252 Beiträge
 
Delphi 2010 Professional
 
#1

ShellApiEx funzt aber Hauptprogramm stürzt ab (Einzeiler)

  Alt 3. Nov 2006, 11:18
Huhu ich mal wieder!

Ich nutze die ShellApiEx.pas wie folgt:

Delphi-Quellcode:
if ShellExecuteAndWaitW(Application.Handle, 'open', 'MSDE\Setup_MSDE2K.EXE', nil, nil, sw_shownormal, TRUE) = 42 then
begin
 //Gestartete Anwendung wurde beendet
 showmessage('MSDE Setup läuft nicht mehr');
end;
Ich versuche auf das Beenden des MSDE 2.0 Setups reagieren. Verschiedene Tests mit NOTEPAD ergaben, dass die Funktion den Wert 42 zurückgiebt wenn das aufgerufene Programm geschlossen wird. Alles wunderbar!

Jetzt hab ich halt das NOTEPAD gegen ein Setup getauscht. Der Aufruf klappt prima, auch auf das vorzeitige Beenden des Setups reagiert mein Programm. Doch leider kann das Setup nicht vollständig ausgeführt werden - bei ca. 12 Sekunden Rest-installationszeit reagiert meine Hauptanwendung nicht mehr....

Wenn ich das MSDE Setup ohne "fremde" Hilfe aufrufe funktionierts prima. Auch mit dem "normalen" Shellexecute lässt sich das MSDE Setup ganz durchführen - nur nicht mit dem ShellExecuteAndWaitW

Woran könnte das liegen?
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

Re: ShellApiEx funzt aber Hauptprogramm stürzt ab (Einzeiler

  Alt 3. Nov 2006, 11:39
Wie sieht denn ShellExecuteAndWaitW aus?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Ajin

Registriert seit: 23. Feb 2006
Ort: Mons
252 Beiträge
 
Delphi 2010 Professional
 
#3

Re: ShellApiEx funzt aber Hauptprogramm stürzt ab (Einzeiler

  Alt 3. Nov 2006, 11:43
Delphi-Quellcode:
unit ShellApiEx;
(******************************************************************************)
(*************   This code is released into the PUBLIC DOMAIN   ***************)
(*************   [url]http://assarbad.net[/url] | [url]http://assarbad.org[/url]      ***************)
(******************************************************************************)
interface
uses
  Windows;

{.$DEFINE UNICODE}// Defines wether the unicode or the ansi prototype is to be used!

function ShellExecuteAndWaitA(hWnd: HWND; Operation, FileName, Parameters, Directory: PAnsiChar; ShowCmd: Integer; bWait: BOOL): HINST; stdcall;
function ShellExecuteAndWaitW(hWnd: HWND; Operation, FileName, Parameters, Directory: PWideChar; ShowCmd: Integer; bWait: BOOL): HINST; stdcall;

type
  TShellExecuteAndWait = function(hWnd: Windows.HWND;
{$IFDEF UNICODE}
    Operation, FileName, Parameters, Directory: PWideChar;
{$ELSE}
    Operation, FileName, Parameters, Directory: PAnsiChar;
{$ENDIF}
    ShowCmd: Integer; bWait: BOOL): HINST; stdcall;
var
  ShellExecuteAndWait: TShellExecuteAndWait =
{$IFDEF UNICODE}
  ShellExecuteAndWaitW;
{$ELSE}
  ShellExecuteAndWaitA;
{$ENDIF}

implementation
uses ShellApi;
(*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  GERMAN ABSTRACT (important informations below in English)

  Meine Kommentare im Quelltext sind Englisch, hier beschränke ich mich aber auf
  Deutsch:

  ShellExecute() ist weithin bekannt. Komischerweise gilt dies scheinbar
  (zumindest unter Delphianern nicht für ShellExecuteEx(). Man sieht oft
  Beispiele auf die Frage: "wie führe ich ein Programm aus und warte, bis es
  beendet ist?" - ich habe aber bisher nur Varianten mit CreateProcess gesehen,
  es gehört aber IMHO zum guten Ton auch auf ShellExecuteEx zu verweisen.

  Wieso? Nun, es ist eine erweiterte Version von ShellExecute und bietet die
  selben Vorteile (i.e. Ausführen von "Dateien" die bei einer Anwendung
  registriert sind, Benutzung von Verben ... EDIT, PRINT, OPEN ...). Außerdem
  wird eben das Handle zum neu erzeugten Prozeß zurückgeliefert, so daß man auf
  dessen Ende warten kann.

  Ansonsten kann man ShellExecuteEx auch nehmen um Informationen über den Prozeß,
  der erstellt wird, zu erhalten. Dazu möchte ich auf das Windows Platform SDK
  verweisen, da es dort eine ausführliche Beschreibung gibt und es müßig ist
  alle Varianten der Nutzung zu erklären. Die wichtigste Ist hier umgesetzt.

  Assarbad AT gmx DOT info [2003-06-22]

  PS: Ich arbeite mit den Records als Variablen, um die Abfrage ob eine
      Allozierung erfolgreich war zu vermeiden.
  ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*)


(*
  There are 2(3) new functions declared in this unit:
  - ShellExecuteAndWaitW(),
  - ShellExecuteAndWaitA()
  (ShellExecuteAndWait as either Unicode or Ansi version of the above functions!)

  The functions share the syntax with the standard ShellExecute(A|W) API, with
  one exception:
    - There is an additional parameter. On Delphi 4 up you could define a default
      value of "False" which would resemble the functionality of ShellExecute.
      I did not define this value to keep compatibility with Delphi 3.
      Description:
        The value is a BOOL (LongBool) which determined wether the function
        should wait for the new process to finish or not.
*)


function ShellExecuteAndWaitW(hWnd: HWND; Operation, FileName, Parameters, Directory: PWideChar; ShowCmd: Integer; bWait: BOOL): HINST; stdcall;
var
  sei: TShellExecuteInfoW;
begin
// Delete any contents of this variable (undetermined for complex types)
  ZeroMemory(@sei, sizeof(sei));
// Fill the information structure with all ShellExecute standard parameters
  with sei do
  begin
    cbSize := sizeof(sei);
    fMask := SEE_MASK_NOCLOSEPROCESS; // we want a process handle returned!
    Wnd := hWnd;
    lpVerb := Operation; // Pre-defined: edit, explore, find, open, print, nil
    lpFile := FileName;
    lpParameters := Parameters;
    lpDirectory := Directory;
    nShow := ShowCmd;
  end;
// Call ShellExecuteEx()
  if ShellExecuteExW(@sei) then
  try
    if bWait then
      WaitForSingleObject(sei.hProcess, INFINITE);
  finally
// Close references to new process! THIS ALSO NEEDS TO BE DONE IF THE PROCESS
// IS ALREADY FINISHED WITH EXECUTION!!!
    CloseHandle(sei.hProcess);
  end;
// Return a value (not actually HINST, as with ShellExecute! ... see Platform SDK)
  result := sei.hInstApp;
end;

function ShellExecuteAndWaitA(hWnd: HWND; Operation, FileName, Parameters, Directory: PAnsiChar; ShowCmd: Integer; bWait: BOOL): HINST; stdcall;
var
  sei: TShellExecuteInfoA;
begin
// Delete any contents of this variable (undetermined for complex types)
  ZeroMemory(@sei, sizeof(sei));
// Fill the information structure with all ShellExecute standard parameters
  with sei do
  begin
    cbSize := sizeof(sei);
    fMask := SEE_MASK_NOCLOSEPROCESS; // we want a process handle returned!
    Wnd := hWnd;
    lpVerb := Operation; // Pre-defined: edit, explore, find, open, print, nil
    lpFile := FileName;
    lpParameters := Parameters;
    lpDirectory := Directory;
    nShow := ShowCmd;
  end;
// Call ShellExecuteEx()
  if ShellExecuteExA(@sei) then
  try
    if bWait then
      WaitForSingleObject(sei.hProcess, INFINITE);
  finally
// Close references to new process! THIS ALSO NEEDS TO BE DONE IF THE PROCESS
// IS ALREADY FINISHED WITH EXECUTION!!!
    CloseHandle(sei.hProcess);
  end;
// Return a value (not actually HINST, as with ShellExecute! ... see Platform SDK)
  result := sei.hInstApp;
end;

end.
  Mit Zitat antworten Zitat
Ajin

Registriert seit: 23. Feb 2006
Ort: Mons
252 Beiträge
 
Delphi 2010 Professional
 
#4

Re: ShellApiEx funzt aber Hauptprogramm stürzt ab (Einzeiler

  Alt 6. Nov 2006, 10:10
Tach Jungs!

Hat jemand eine Idee was ich bei der Benutzung dieser routine falsch mache?
  Mit Zitat antworten Zitat
zeras

Registriert seit: 11. Mär 2007
Ort: Saalkreis
1.618 Beiträge
 
Delphi 12 Athens
 
#5

AW: ShellApiEx funzt aber Hauptprogramm stürzt ab (Einzeiler)

  Alt 28. Okt 2012, 09:34
Ist zwar schon einige Tage alt, aber ich habe auch das Problem, dass die Funktion nicht geht. Auch bei mir stürzt mein Programm ab. Wenn ich nur ShellExecute nutze, stürzt das Programm nicht ab.

Hier mein Aufruf.
ShellExecuteAndWaitW(Application.Handle, 'open', PChar('notepad.exe'), PChar(fname), Nil, SW_SHOW, True);
Matthias
Es ist nie falsch das Richtige zu tun!
- Mark Twain
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.163 Beiträge
 
Delphi 12 Athens
 
#6

AW: ShellApiEx funzt aber Hauptprogramm stürzt ab (Einzeiler)

  Alt 28. Okt 2012, 10:07
Was heißt "stürzt ab" ?

Und in welcher Zeile, bzw. bei welchem Befehl?
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
zeras

Registriert seit: 11. Mär 2007
Ort: Saalkreis
1.618 Beiträge
 
Delphi 12 Athens
 
#7

AW: ShellApiEx funzt aber Hauptprogramm stürzt ab (Einzeiler)

  Alt 28. Okt 2012, 10:38
Was heißt "stürzt ab" ?

Und in welcher Zeile, bzw. bei welchem Befehl?

Ich nutze TMS Grids und dort passiert offensichtlich der Absturz. Windows meldet nur einen Fehler und will nach der Ursache suchen.
Quelltext wie folgt:

Delphi-Quellcode:
function ShellExecuteAndWaitW(hWnd: HWND; Operation, FileName, Parameters, Directory: PWideChar; ShowCmd: Integer; bWait: BOOL): HINST; stdcall;
var
  sei: TShellExecuteInfoW;
begin
// Delete any contents of this variable (undetermined for complex types)
  ZeroMemory(@sei, sizeof(sei));
// Fill the information structure with all ShellExecute standard parameters
  with sei do
  begin
    cbSize := sizeof(sei);
    fMask := SEE_MASK_NOCLOSEPROCESS; // we want a process handle returned!
    Wnd := hWnd;
    lpVerb := Operation; // Pre-defined: edit, explore, find, open, print, nil
    lpFile := FileName;
    lpParameters := Parameters;
    lpDirectory := Directory;
    nShow := ShowCmd;
  end;
// Call ShellExecuteEx()
  if ShellExecuteExW(@sei) then <<<<<<<<<<<<<hier kommt Aufruf von MsgHookProc ins AdvGrid


function MsgHookProc(Code: Integer; CurrentProcess: Cardinal; HookStruct: PCWPStruct): integer; stdcall;
begin
  ...

  Result := CallNextHookEx(MsgHook, Code, CurrentProcess, Integer(HookStruct)) <<< bei Aufruf der Funktion kommt dann die Windows Meldung
end;
Matthias
Es ist nie falsch das Richtige zu tun!
- Mark Twain
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.163 Beiträge
 
Delphi 12 Athens
 
#8

AW: ShellApiEx funzt aber Hauptprogramm stürzt ab (Einzeiler)

  Alt 28. Okt 2012, 10:45
Hmmm, dann ist es wohl eher ein Problem bei ADV?

Versuch es mal probehalber mit einer 0, statt dem Application.Handle.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
zeras

Registriert seit: 11. Mär 2007
Ort: Saalkreis
1.618 Beiträge
 
Delphi 12 Athens
 
#9

AW: ShellApiEx funzt aber Hauptprogramm stürzt ab (Einzeiler)

  Alt 28. Okt 2012, 11:03
Versuch es mal probehalber mit einer 0, statt dem Application.Handle.

So kommt auch die Windowsmeldung. Vielleicht sollte ich mal TMS auf den letzten Stand bringen?
ShellExecuteAndWait(0, 'open', PChar('notepad.exe'), PChar(fname), Nil, SW_SHOW, True);
Matthias
Es ist nie falsch das Richtige zu tun!
- Mark Twain
  Mit Zitat antworten Zitat
zeras

Registriert seit: 11. Mär 2007
Ort: Saalkreis
1.618 Beiträge
 
Delphi 12 Athens
 
#10

AW: ShellApiEx funzt aber Hauptprogramm stürzt ab (Einzeiler)

  Alt 28. Okt 2012, 15:25


So kommt auch die Windowsmeldung. Vielleicht sollte ich mal TMS auf den letzten Stand bringen?
ShellExecuteAndWait(0, 'open', PChar('notepad.exe'), PChar(fname), Nil, SW_SHOW, True);
Nun bin ich weiter. Wenn ich das Programm nicht in der IDE starte, sondern die Exe, dann geht es. Ist doch komisch oder?
TMS habe ich noch nicht aktualisiert.
Matthias
Es ist nie falsch das Richtige zu tun!
- Mark Twain
  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 08:15 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