Entwickler-Ecke

Dateizugriff - solange mein Progr läuft, soll kein anderes starten können


Pierre - Do 02.01.03 21:40
Titel: solange mein Progr läuft, soll kein anderes starten können
Hallo,
wie kann ich es einrichten, dass mein Programm erst alles abarbeitet und erst, wenn es sich beendet hat, sich ein anderes (fremdes) Programm starten läßt?
Gruß Pierre


Raphael O. - So 05.01.03 15:23

schauen welche exe dateien laufen geht so: http://www.swissdelphicenter.ch/de/showcode.php?id=616

die fremden exe Dateien schließen kannste dann so

Quelltext
1:
PostMessage(FindWindow(nil,pchar('Delphi 5'),WM_CLOSE, 0, 0);                    


du musst halt überprüfen was am anfang offen war und dann während dein programm läuft alles was neu läuft sofort wieder schließen :wink:

Fiji-Fighter


Delete - So 05.01.03 21:02

Und wenn er nicht das Hauptfenster der Anwendung erwischt, läuft der Prozess munter weiter.


Raphael O. - Mo 06.01.03 17:19

wenn es ein hauptfenster gibt, dann erwischt er es mit dieser methode auch...
andernfalls sollte sich wer was besseres ausdenken... :wink:

Fiji-Fighter


Delete - Mo 06.01.03 18:19

Ja aber nicht mit 100%-ger Sicherheit.


Raphael O. - Mo 06.01.03 18:35

warum nicht???


Delete - Mo 06.01.03 18:48

Ja wenn er eben nicht das Hauptfenster erwischt. Wenn er bei ICQ nur ein Messagenfenster schließt., dann läuft der eigentliche Prozess noch weiter. Killt er aber den Hauptprozess (icq.exe) dann ist alles dicht.


Raphael O. - Mo 06.01.03 18:53

meine methode killt aber jedes Fenster, dass nach dem programmstart neu dazukommt...
wenn es also ein hauptfenster gibt, dann wird es auch gekillt!!!!! :twisted:

Fiji-Fighter


Raphael O. - Mi 08.01.03 14:56

Habe im Internet noch folgende Anleitung gefunden um auch Prozesse zu beenden:
Zitat:

Prozesse auflisten und beenden
Mit der nachfolgend aufgeführten Routinen können Sie die in einer Windowssitzung laufenden Prozesse aufzeigen und bei Bedarf auch entfernen. Hierfür benötigen Sie ein Formobject, ein ListViewobject und zu- mindest ein ButtonObject. Verknüpfen Sie das Buttonobject mit dem BtnRefreshClick damit gleich beim Start des Programms alle Prozesse angezeigt werden. Zum löschen eines Prozesses müssen Sie eine Verknüpfung zwischen DblClick des Listviewobject mit der Procedure ListviewDblClick. Wie aus den beigefügten Routinen ersichtlich, kann auch ein einzelner Prozess gesucht und terminiert werden. Die hierzu erforderlichen Schritte können aus der Refreshroutine entnommen werden. Wichtig ist die Einbindung der Unit TlHelp32 !
(Nur für Win95/Win98/ME)
Beispiel:


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:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
interface 
uses 
{ . . . , } TLHelp32 { important ! } 

// Global Variables , Globale Variablen 

VAR aSnapshotHandle:THandle;
  aProcessEntry32:TProcessEntry32;
  
procedure TFormMain.BtnRefreshClick( Sender:TObject);
var i:integer;
  bLoop:BOOL;
  NewItem:TListItem;
begin 
  ListView.Items.Clear;
  aSnapshotHandle:=CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS,0);
  aProcessEntry32.dwSize:=Sizeof( aProcessEntry32);
  bLoop:=Process32First( aSnapshotHandle,aProcessEntry32);
  while integer( bLoop)<>0 do 
  begin 
    NewItem:=ListView.Items.add;
    NewItem.Caption:=ExtractFileName( aProcessEntry32.szExeFile);
    NewItem.subItems.Add( IntToHex( aProcessEntry32.th32ProcessID,4));
    NewItem.subItems.Add( aProcessEntry32.szExeFile);
    ContinueLoop:=Process32Next( aSnapshotHandle,aProcessEntry32);
  end;
  CloseHandle( aSnapshotHandle);
end;

procedure TFormMain.ListViewDblClick( Sender:TObject);
var Ret:BOOL;
  PrID:integer;// processidentifier 
  Ph:THandle;// processhandle 
  begin 
  try 
    with ListView do 
    begin 
      if MessageDlg( 'Do you want to Terminate "'+ItemFocused.Caption+'"?'+^J+
      'posible the system is instabile or out of'+^J+
      'control......',
      mtConfirmation,[mbYes,mbNo],0)=mrYes then 
      begin 
        PrID:=StrToInt( '$'+ItemFocused.SubItems[0]);
        Ph:=OpenProcess( 1,BOOL( 0),PrID);
        Ret:=TerminateProcess( Ph,0);
        if Integer( Ret)=0 Then 
        MessageDlg( 'Can Not Terminate "'+ItemFocused.Caption+'"',mtInformation,[mbOk],0) 
        else 
        ItemFocused.Delete;
      end;
    end;
  except 
  end;
end;

procedure TFormMain.FormCreate( Sender:TObject);
begin 
  // Application . OnHint := DisplayHint ; // If you want / need it . . . 
  BtnRefreshClick( Sender);
end;



Vielleicht klappts, vielleicht aber auch nicht :wink: :wink:

Fiji-Fighter


Pierre - Mi 08.01.03 20:51

Hallo,
ich werde beide Wege ausprobieren.
Vielen Dank Pierre