Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - ShellExecuteEx - Aufruf von winzip schmeisst Execution


Laaeris - So 12.12.10 14:24
Titel: ShellExecuteEx - Aufruf von winzip schmeisst Execution
Hallo zusammen,

ich habe keinen Systemwechsel durchgeführt und plötzlich zwei Probleme, obwohl ich nichts geändert habe:
- weder am System
- noch am Code der Applikation
- noch am Winzip oder am Mediaplayer.

Problem 1:
Ich erhalte eine External Exception beim Aufruf von winzip.

Code:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
       Optionsstring := '-min -a '
                        +CHR(34)
                        +Pfad
                        +DataModul.Macht.FieldValues['DATENPFAD']
                        +'_DB_'
                        +inttostr(Datamodul.Stamm.FieldValues['MONATE'])
                        +'_'
                        +inttostr(Datamodul.Stamm.FieldValues['JAHRE'])
                        +CHR(34)
                        +' '
                        +CHR(34)
                        +Pfad
                        +'Datenbank\'+Hauptserver+'\ComStar\*.*'
                        +CHR(34);
   try
    Success := False;
    if WarteBox.Checked then
     begin
     // Disable the button while the external app is running
     // Make sure to re-enable the button afterwards
      Zippen.Enabled := False;
      Success := ExecAppWait('winzip',Optionsstring);
     end
    else
     begin
      InstanceID := ShellExecute(Handle, 'open', PChar('winzip'),
        PChar(Optionsstring), nil, SW_SHOW);
      Success := InstanceID >= 32// a value less than 32 is an error
     end;
   finally
    Zippen.Enabled := True;
   end;
   if not Success then
    ShowMessage('Application failed: ' + 'winzip' + ' ' +
      Optionsstring);

Die zugehörige Funktion. Der Fehler wird bei Result:=ShellExecuteEx(@ShellExInfo) geworfen und ist auch nicht mit try...except abzufangen (ausserdem will ich ja zippen) :-):

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
function ExecAppWait(AppName, Params: string): Boolean;
var
  // structure containing and receiving info about application to start
  ShellExInfo: TShellExecuteInfo;
begin
  FillChar(ShellExInfo, SizeOf(ShellExInfo), 0);
  with ShellExInfo do begin
    cbSize := SizeOf(ShellExInfo);
    fMask := see_Mask_NoCloseProcess;
    Wnd := Application.Handle;
    lpFile := PChar(AppName);
    lpParameters := PChar(Params);
    nShow := sw_ShowNormal;
  end;
  Result := ShellExecuteEx(@ShellExInfo);
  if Result then
    while WaitForSingleObject(ShellExInfo.HProcess, 100) = WAIT_TIMEOUT do
    begin
      Application.ProcessMessages;
      if Application.Terminated then Break;
    end;
end;


Problem 2:
Das schildere ich nur deswegen, weil es evtl. zusammenhängt:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
          with Player do
            begin
              FileName :=pfad+'Sounds\Explosion'+a+'.wav';
              Open;
              wait:=true;
              Play;             
              Close;
            end;


...führt ebenfalls plötzlich zu dem Fehler, dass mir die EXE sagt: Windows hat keinen Player installiert, der WAV-Files abspielen kann (natürlich hat er, natürlich kann er).

Ich habe zwar einige Hinweise gegoogelt und auch in diesem Forum wieder ein paar Dinge gesehen, aber so richtig komme ich mit meinem Problem nicht weiter.

HILFE! :-)

Viele Grüße

David


jaenicke - So 12.12.10 14:37

user profile iconLaaeris hat folgendes geschrieben Zum zitierten Posting springen:
Ich erhalte eine External Exception beim Aufruf von winzip.
[..]
Der Fehler wird bei Result:=ShellExecuteEx(@ShellExInfo) geworfen und ist auch nicht mit try...except abzufangen (ausserdem will ich ja zippen) :-):
Funktioniert es denn ohne warten? Und warum ignorierst du denn dann den Fehlerwert von ShellExecute, schließlich steht da ja ggf. drin, was für ein Fehler aufgetreten ist, nicht nur dass einer passiert ist.

Und bei ShellExecuteEx:
Was sagt denn GetLastError (wie in der Doku dazu steht)?

Und zu der externen Exception: Steht da noch mehr drin? Kommt die in deinem Programm oder in Winzip?

Was mir generell auffällt: Du setzt kein Arbeitsverzeichnis. Das ist in der Regel keine gute Idee.

Ja, und dann noch:
Warum muss es denn WinZip sein? Warum baust du nicht einfach die Zipfähigkeit direkt in dein Programm ein? :gruebel:


Delete - So 12.12.10 22:01

Also der Threadtitel ist ja schon ein Lacher für sich.