Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Bei Programmaufruf eigene Anwendung nicht beenden? (https://www.delphipraxis.net/75663-bei-programmaufruf-eigene-anwendung-nicht-beenden.html)

smart 23. Aug 2006 08:41


Bei Programmaufruf eigene Anwendung nicht beenden?
 
Hallo Alle!

Wenn ich aus mein Programm ein anderes Programm starten möchte z.B. mit
Delphi-Quellcode:
ExecuteFile(C:\WINDOWS\System32\sndrec32.exe,'', '', SW_SHOWNORMAL);
Klappt zwar der Aufruf, aber mein Programm beendet sich automatisch. Wie kann ich das verhindern? (Übrigens nicht bei jedem Programm.)

Gruß
Heike

Klaus01 23. Aug 2006 08:48

Re: Bei Programmaufruf eigene Anwendung nicht beenden?
 
Guten Morgen,

bekommst Du irgendeine Fehlermeldung wenn sich Dein Programm verabschiedet?

Grüße
Klaus

Flocke 23. Aug 2006 09:39

Re: Bei Programmaufruf eigene Anwendung nicht beenden?
 
Woher kommt denn das ExecuteFile? Standard-Delphi ist es nicht...

mschaefer 23. Aug 2006 09:47

Re: Bei Programmaufruf eigene Anwendung nicht beenden?
 
Moin,moin,

Heike, probier es mal mit nachfolgendem Codeschnipsel. Hier wird zudem der Mehrfachstart
einner Anwendung unterbunden.

Delphi-Quellcode:

procedure TForm1.Application_Start
(const   ApplicationName   : string;
 const   AppParamString    : string);
var
    rect : TRect;
    Wnd : HWND;
begin
   Wnd :=  FindWindow ( nil, PChar(copy( ApplicationName,1,abs(length( ApplicationName )-4 ))) );
   if Wnd <> 0 then SetForegroundWindow( Wnd )
   else
   begin
         SystemParametersInfo(SPI_GETWORKAREA, 0, @Rect, 0);
         Application.ProcessMessages;
         ShellExecute
         (  0,
            'open',
            PChar( ExtractFilePath(application.ExeName)+ApplicationName),
          //  PChar( AppParamString                                     ),
            '',
            '',
            SW_SHOWNORMAL
         );
   end;
   Application.ProcessMessages;
   SleepEx( 1000, false );
end;
Grüße // Martin

smart 23. Aug 2006 11:22

Re: Bei Programmaufruf eigene Anwendung nicht beenden?
 
Zitat:

Zitat von Klaus01
Guten Morgen,

bekommst Du irgendeine Fehlermeldung wenn sich Dein Programm verabschiedet?

Grüße
Klaus

Hallo Klaus!

Nein, kommt keine Fehlermeldung.

Gruß
Heike

smart 23. Aug 2006 11:23

Re: Bei Programmaufruf eigene Anwendung nicht beenden?
 
Zitat:

Zitat von Flocke
Woher kommt denn das ExecuteFile? Standard-Delphi ist es nicht...

Kammt aus der Unit FmxUtils.Pas. War glaube ich, auf der Delhpi 7 CD.

Gruß
Heike

smart 23. Aug 2006 11:37

Re: Bei Programmaufruf eigene Anwendung nicht beenden?
 
Zitat:

Zitat von mschaefer
Moin,moin,

Heike, probier es mal mit nachfolgendem Codeschnipsel. Hier wird zudem der Mehrfachstart
einner Anwendung unterbunden.

Grüße // Martin

Hallo Martin!

Da tut sich bei mir nichts. Kommt auch keine Fehlermeldung. Vieleicht rufe ich es auch falsch auf. Wir ist der Aufruf?

Gruß
Heike

Klaus01 23. Aug 2006 11:55

Re: Bei Programmaufruf eigene Anwendung nicht beenden?
 
Hallo Heike,

ich benutze meistens diesen Code:

Delphi-Quellcode:
{ WindowState is one of the SW_xxx constants.
  Look up ShowWindow in the API help for a list.}
function ExecAndWait(const Filename, Params: string;wait:Boolean;WindowState: word): boolean;
{$IFDEF WIN32}
var
  SUInfo: TStartupInfo;
  ProcInfo: TProcessInformation;
  CmdLine: string;
begin
  { Enclose filename in quotes to take care of
    long filenames with spaces. }
  CmdLine := '"' + Filename + '" ' + Params;
  FillChar(SUInfo, SizeOf(SUInfo), #0);
  with SUInfo do begin
    cb := SizeOf(SUInfo);
    dwFlags := STARTF_USESHOWWINDOW;
    wShowWindow := WindowState;
  end;
  try
    Result := CreateProcess(NIL, PChar(CmdLine), NIL, NIL, FALSE,
                            CREATE_NEW_CONSOLE or
                            NORMAL_PRIORITY_CLASS, NIL,
                            PChar(ExtractFilePath(Filename)),
                            SUInfo, ProcInfo);
  except
    on E: Exception do
      begin
        Result:=false;
      end;
  end;

  { Wait for it to finish. }
  if Result and wait then
    WaitForSingleObject(ProcInfo.hProcess, INFINITE);

{$ELSE}
var
  InstanceID : THandle;
  Buff: array[0..255] of char;
begin
  StrPCopy(Buff, Filename + ' ' + Params);
  InstanceID := WinExec(Buff, WindowState);
  if InstanceID < 32 then
  { a value less than 32 indicates an Exec error }
    Result := FALSE
  else begin
    Result := TRUE;
    if wait then
      repeat
        Application.ProcessMessages;
      until Application.Terminated or (GetModuleUsage(InstanceID) = 0);
  end;
{$ENDIF}
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  ExecandWait('C:\WinNT\System32\sndrec32.exe','',false,sw_normal);
end;
Habe das mal mit dem Aufruf von SondRec ausprobiert, aber das Programm stürzt nicht ab.

Kannst Du Deine Anwendung eventuell mal auf einem andern Rechner ausprobieren?
Vielleicht ist etwas mit dem Speicher?

Grüße
Klaus

Neutral General 23. Aug 2006 12:00

Re: Bei Programmaufruf eigene Anwendung nicht beenden?
 
Warum immer mit so komplizierten und großen proceduren?
Warum nicht einfach Shellexecute?

Delphi-Quellcode:
uses shellapi;

Shellexecute(handle,'open',Pchar(Filename),'','',SW_SHOW);
:?:

Delphi-Quellcode:
Shellexecute(handle,'open',Pchar('sndrec32.exe'),'','',SW_SHOW);
funktioniert bei mir ohne Probleme!

Gruß
Neutral General

faux 23. Aug 2006 12:00

Re: Bei Programmaufruf eigene Anwendung nicht beenden?
 
Wieso nicht einfach ShellExecute?

EDIT: Roter Kasten? :gruebel:


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:42 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz