Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   ShellExecute Laufzeitproblem (https://www.delphipraxis.net/127568-shellexecute-laufzeitproblem.html)

LuCSteR 15. Jan 2009 15:54


ShellExecute Laufzeitproblem
 
Hi,

um die beiden zeilen geht es:
Delphi-Quellcode:
ShellExecute(0, 'open', PChar(GetCurrentDir+'\7za.exe'), PChar('e -o"'+TempDownloadDir+IP+'" "'+TempDownloadDir+IP+'\'+Form1.ListBox3.Items[i]+'"'), nil, SW_SHOWNORMAL);
         
DeleteFile(TempDownloadDir+IP+'\'+Form1.ListBox3.Items[i]);
erst wird die datei entpackt (TempDownloadDir+IP+'\'+Form1.ListBox3.Items[i]) und danach soll sie gelöscht werden. die entpackten dateien haben namen verschieden von der gepackten datei. aber trotzdem werden alle entpackten und die gepackte datei gelöscht.

da die sache przedural nacheinander abläuft müsste das ergebnis sein, das nur noch die entpackten dateien vorliegen. tun sie aber nicht.

grüße steve

nahpets 15. Jan 2009 16:25

Re: ShellExecute Laufzeitproblem
 
Hallo,

brauchst Du auch hier wieder die Hochkommas?

LuCSteR 16. Jan 2009 09:45

Re: ShellExecute Laufzeitproblem
 
Wie meinst du deine Frage? An welcher Stelle Hochkommatas?
Wenn ich den Delete-Befehl weglasse werden alle Dateien ordnungsgemäß entpackt.
Jetzt sollen nur die Zip-Archive gelöscht werden. Diese haben aber einen ganz anderen Namen als die entpackten Dateien. Und trotzdem werden die Zips und die entpackten Dateien gelöscht.

Habe ich da ein Laufzeit Problem? Kann ja sein, das das Shellexecute ausgeführt wird, aber garnicht auf dessen "ende gewartet" und gleich der nächste Befehl ausgeführt wird.

nuclearping 16. Jan 2009 09:57

Re: ShellExecute Laufzeitproblem
 
ShellExecute wartet nicht, bis die Anwendung beendet wurde.

Schau dir das mal an -> http://www.delphi-library.de/printvi...=77895&start=0
Oder -> http://www.swissdelphicenter.ch/torr...code.php?id=93

LuCSteR 16. Jan 2009 10:16

Re: ShellExecute Laufzeitproblem
 
Die funktionen laufen bei mir nicht.
Hab die ExecusionInfo angepasst aber trotzdem kommt in der zeile
Delphi-Quellcode:
  If ShellExecuteEx(@ExecuteInfo) and (ExecuteInfo.hInstApp> 32) then
dieser Fehler
Delphi-Quellcode:
Unit1.pas(412,6) Error: Can't determine which overloaded function to call
Die Variable Wnd sollte auch in hWnd umgeschrieben werden, sonst gibs auch nen Fehler.

Kann mir da jmd weiterhelfen? Ansonsten muss ich das Prob iwie anders lösen.


---Edit---
werd mich gleich mal mit dem 2ten Link beschäftigen. danke

nahpets 16. Jan 2009 10:21

Re: ShellExecute Laufzeitproblem
 
Hallo,
Zitat:

Zitat von LuCSteR
Wie meinst du deine Frage? An welcher Stelle Hochkommatas?
Wenn ich den Delete-Befehl weglasse werden alle Dateien ordnungsgemäß entpackt.
Jetzt sollen nur die Zip-Archive gelöscht werden. Diese haben aber einen ganz anderen Namen als die entpackten Dateien. Und trotzdem werden die Zips und die entpackten Dateien gelöscht.

Habe ich da ein Laufzeit Problem? Kann ja sein, das das Shellexecute ausgeführt wird, aber garnicht auf dessen "ende gewartet" und gleich der nächste Befehl ausgeführt wird.

ich dachte eventuell so:
Delphi-Quellcode:
DeleteFile('"' + TempDownloadDir+IP+'\'+Form1.ListBox3.Items[i] + '"');
DeleteFile ist vom Type Boolean, frag' mal den Rückgabewert davon ab, eventuell ist ja garnicht das Löschen das Problem, sondern irgend was anderes?

nuclearping 16. Jan 2009 10:35

Re: ShellExecute Laufzeitproblem
 
Zitat:

Kann mir da jmd weiterhelfen? Ansonsten muss ich das Prob iwie anders lösen.
Wenn die Codes aus den Links nicht direkt 1:1 gehen, sollte das Prinzip was dahinter steht, dennoch klar sein: Du mußt warten, bis die Anwendung, die dein Programm startet, beendet ist.

LuCSteR 16. Jan 2009 10:38

Re: ShellExecute Laufzeitproblem
 
Naphets,

daran liegt es leider nicht. schön wärs. liegt daran das ShellExecute nicht wartet.
Da versucht man ein Prob zu lösen und hat damit nen noch schwereres ausgelöst...

@nuclearping:
das Prinzip ist klar :) Aber die Lösung nicht.

LuCSteR 16. Jan 2009 10:53

Re: ShellExecute Laufzeitproblem
 
Delphi-Quellcode:
function ShellExecute_AndWait(Operation, FileName, Parameter, Directory: string;
  Show: Word; bWait: Boolean): Longint;
var
  bOK: Boolean;
  Info: TShellExecuteInfo;
 
begin
  FillChar(Info, SizeOf(Info), Chr(0));
  Info.cbSize := SizeOf(Info);
  Info.fMask := SEE_MASK_NOCLOSEPROCESS;
  Info.lpVerb := PChar(Operation);
  Info.lpFile := PChar(FileName);
  Info.lpParameters := PChar(Parameter);
  Info.lpDirectory := PChar(Directory);
  Info.nShow := Show;
  bOK := Boolean(ShellExecuteEx(@Info));
  if bOK then
  begin
    if bWait then
    begin
      while
        WaitForSingleObject(Info.hProcess, 100) = WAIT_TIMEOUT
        do Application.ProcessMessages;
      bOK := GetExitCodeProcess(Info.hProcess, DWORD(Result));
    end
    else
      Result := 0;
  end;
  if not bOK then Result := -1;
end;
Fehlermedlung bei
Delphi-Quellcode:
bOK := Boolean(ShellExecuteEx(@Info));
--> "Unit1.pas(411,18) Error: Can't determine which overloaded function to call"

Was heißt denn das? Vll liegt es an der Syntax, ob die ein wenig unterschiedlich ist bei Lazarus und Delphi? Speziell das "@"?

SirThornberry 16. Jan 2009 11:03

Re: ShellExecute Laufzeitproblem
 
welche Parameter erwartet die Funktion denn bei dir? Entspechend solltest du den gewünschten Parameter-Typ übergeben :)

LuCSteR 16. Jan 2009 11:40

Re: ShellExecute Laufzeitproblem
 
Der Paramtertyp müsste doch stimmen, oder?

nuclearping 16. Jan 2009 12:42

Re: ShellExecute Laufzeitproblem
 
Das ShellExecuteEx unter meinem Delphi 2009 erwartet einen Parameter vom Typ PShellExecuteInfoW.

SirThornberry 16. Jan 2009 12:56

Re: ShellExecute Laufzeitproblem
 
Jetzt braucht uns LuCSteR nur noch mitteilen welcher Typ bei ihm erwartet wird (steht sicher in den sourcen bzw. wird beim Auto-Verfollständigen angezeigt)

LuCSteR 16. Jan 2009 13:00

Re: ShellExecute Laufzeitproblem
 
Bei mir wird: LPShellExecuteInfoW erwartet. Aber was hat das damit zu tun, das der Compiler nicht weiss, welche überladene Funktion er wählen soll? Soweit ich mich erinnern kann war doch bei der Paramterübergabe ein "@" dazu da um eine Funktion/Prozedur zu übergeben. Wenn ich das "@" wegnehme dann kommt die Fehlermeldung:
Delphi-Quellcode:
Unit1.pas(411,37) Error: Incompatible type for arg no. 1: Got "_SHELLEXECUTEINFOA", expected "LPSHELLEXECUTEINFOW"
Aber wie soll ich denn aus "_SHELLEXECUTEINFOA" --> "LPSHELLEXECUTEINFOW" machen? ich besitze nur Grundkentnisse in der Programmierung.

Als Übergangslösung habe ich nen Delay eingebaut. Aber das ist mir zu schmutzig.

SirThornberry 16. Jan 2009 13:10

Re: ShellExecute Laufzeitproblem
 
Verwendest du ShellExecuteExW? Die Meldung ist gewissermaßen verständlich. Denn es gibt ja eine Funktion mit entsprechendem Namen aber keine der Varianten (in dem Fall eine) stimmt mit dem von dir übergebenem Parameter überein. Entsprechend weiß er nicht welche er verwenden soll.

LuCSteR 16. Jan 2009 13:20

Re: ShellExecute Laufzeitproblem
 
Der Source ist ausm Netz. Ich habe den also nicht selbst geschrieben. Ich versuche ihn nur zu benutzen um ein wiederliches kleines Problem endlich sauber zu lösen. Der Code steht im Beitrag #9.

Der entsprechende Aufruf von mir sieht so aus: (bisher immer auskomentiert, da ja iwas mit der Funktion nicht i.o. ist)
Delphi-Quellcode:
ShellExecute_AndWait('open', GetCurrentDir+'\7za.exe', 'e -o"'+TempDownloadDir+IP+'" "'+TempDownloadDir+IP+'\'+Form1.ListBox3.Items[i]+'"', nil, SW_SHOWNORMAL, true);

LuCSteR 16. Jan 2009 15:58

Re: ShellExecute Laufzeitproblem
 
Anderer Ansatz und funktioniert! Aber die Beschreibung zu CreateProcess auf MSDN ist mal total grottig. Da steht das der 1.Paramter den Applikationspfad enthalten soll und der 2.Parameter die Kommandozeile (Übergabeparameter für die Anwendung). Wenn man sich daran hält funktioniert mal garnichts. 1. Parameter auf nil --> autom. wird die Kommandozeile genutzt (das steht aber auch nciht explizit dort) 2.Paramter Anwendungspfad und Übergabeparameter angeben. Wie unten zwar schwer ersichtlich aber erfolgt ist :)

Delphi-Quellcode:
var
  si:STARTUPINFO;
  pi:PROCESS_INFORMATION;

begin
  FillChar(si, SizeOf(si), Chr(0));
  si.cb:=sizeof(si);
  FillChar(pi, SizeOf(pi), Chr(0));
         
  CreateProcess(nil, PChar(GetCurrentDir+'\7za.exe e -o"'+TempDownloadDir+IP+'" "'+TempDownloadDir+IP+'\'+Form1.ListBox3.Items[i]+'"'), nil, nil, FALSE, 0, nil, nil, si, pi);

  WaitForSingleObject(pi.hProcess, infinite)=WAIT_TIMEOUT;

  DeleteFile(TempDownloadDir+IP+'\'+Form1.ListBox3.Items[i]);
end;

Apollonius 16. Jan 2009 16:05

Re: ShellExecute Laufzeitproblem
 
Du bist ein Witzbold.
Die MSDN Library hat zu CreateProcess Folgendes geschrieben:

The lpApplicationName parameter can be NULL. In that case, the module name must be the first white space–delimited token in the lpCommandLine string.

Und wenn lpApplicationName nicht nil ist, funktioniert es auch. Du hast wahrscheinlich vergessen, dass fast alle Programme im ersten Kommandozeilenparameter ihren Dateinamen erwarten.

Und was es bringen sollen, einen Vergleich, der nie wahr werden kann, einfach so in die Landschaft zu setzen, ohne dass das Resultat verwertet wird, ist mir auch schleierhaft.

LuCSteR 16. Jan 2009 16:49

Re: ShellExecute Laufzeitproblem
 
Kann sein das ich etwas überlesen haben. Trotzdem bleibt festzuhalten das es bei mir nur so geklappt hat, wie ich es gepostet habe. Die Kommandozeile habe ich genauso Übergeben wie ich sie auch händisch eingetragen habe (zu testzwecken). Also ist es nicht selbstverständlich das der Anwendungspfad vorangestellt sein muss (in meinem Fall).

diese Varianten haben nicht funktioniert! Wobei die folgende lt. Angaben von MSDN genauso hätte funktionieren müssen.
Delphi-Quellcode:
CreateProcess(PChar(GetCurrentDir+'\7za.exe), PChar(e -o"'+TempDownloadDir+IP+'" "'+TempDownloadDir+IP+'\'+Form1.ListBox3.Items[i]+'"'), nil, nil, FALSE, 0, nil, nil, si, pi);
Delphi-Quellcode:
CreateProcess(PChar(GetCurrentDir+'\7za.exe), PChar(GetCurrentDir+'\7za.exe e -o"'+TempDownloadDir+IP+'" "'+TempDownloadDir+IP+'\'+Form1.ListBox3.Items[i]+'"'), nil, nil, FALSE, 0, nil, nil, si, pi);
Zitat:

Und was es bringen sollen, einen Vergleich, der nie wahr werden kann, einfach so in die Landschaft zu setzen, ohne dass das Resultat verwertet wird, ist mir auch schleierhaft.
Biste da im Fenster verutscht?
Wie auch immer schönes WE.

DeddyH 16. Jan 2009 16:56

Re: ShellExecute Laufzeitproblem
 
Er ist nicht im Fenster verrutscht.
Zitat:

Delphi-Quellcode:
WaitForSingleObject(pi.hProcess, infinite)=WAIT_TIMEOUT;

Was soll das bitte sein? Und weshalb prüfst Du nicht die Rückgabewerte der aufgerufenen Funktionen?

Apollonius 16. Jan 2009 16:59

Re: ShellExecute Laufzeitproblem
 
In der zweiten Variante kann ich keinen offensichtlichen Fehler entdecken. Was sagt denn GetLastError?

DeddyH 16. Jan 2009 17:02

Re: ShellExecute Laufzeitproblem
 
Ob GetCurrentDir da die richtige Funktion ist? Glaube ich eher nicht.


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