Entwickler-Ecke

Sonstiges (Delphi) - exe nicht über tastkill beenden


Petros - So 22.01.12 17:47
Titel: exe nicht über tastkill beenden
Hallo Delphi Freunde.

Nun brauch mal wieder einen rat bzw hilfe von euch..

Ich habe ein remote programm geschrieben wo ich per client mich mit dem server (extra server programm) verbinden kann und dort programme starten und beenden. Soweit funktioniert das ganze auch super...

Jetzt kommt mein problem ich habe einen hauptordner mit 3 unterordner auf dem server dort sind 3 identische server.exe drin ich kann sie zwar per taskkill beenden aber dann beenden sich alle 3 programme wie kann ich es machen das er diese einzeln beendet.

beispiel

...........|------------------ordner 1 |------ server.exe
Hauptordner|------------------ordner 2 |------ server.exe
...........|------------------ordner 3 |------ server.exe

Es handelt sich um 3 shotcast server / 3 streams.

Es geht darum das einige leute von mir diese starten und stoppen können ohne auf dem Remote Desktop drauf zuzugreifen.
da ich nicht 24 stunden am tag auf meinem server drauf bin und ich den leuten den zugang nicht gebe zum remot desktop habe ich dem entsprechen ein programm geschrieben

Hat jemand eine idee. Hab es schon per Batch datei versucht aber hat nicht wirklich geklappt.


Quelltext
1:
2:
3:
4:
@echo off
echo
C:\Users\Administrator\Desktop\Stream Software\haupt\sc_serv.exe
exit


ich hoffe ich habs einigermaßen verständlich erklärt ansonsten ändere ich es noch etwas


jaenicke - So 22.01.12 17:57

Wie wäre es, wenn du in die Serveranwendung eine Möglichkeit einbaust diese von außen zu beenden? :gruebel: Da herumzufrickeln und die einfach abzuschießen ist ja nun keine wirkliche Lösung. :shock:

Aber vom Prinzip her musst du nur alle Prozesse mit EnumProcesses [http://msdn.microsoft.com/en-us/library/windows/desktop/ms682629.aspx] enumerieren, mit OpenProcess [http://msdn.microsoft.com/en-us/library/windows/desktop/ms684320.aspx] öffnen und die passenden mit TerminateProcess [http://msdn.microsoft.com/en-us/library/windows/desktop/ms686714.aspx] abschießen.

Ein kleines Beispiel findest du hier:
http://www.delphi-library.de/topic_Prozessliste+erstellen_41114,0.html


Petros - So 22.01.12 18:24

Zitat:
Wie wäre es, wenn du in die Serveranwendung eine Möglichkeit einbaust diese von außen zu beenden?

welche serveranwendung meinst du.. den Remot Server oder den Shoutcast Server..

ich will diese ja von außen beenden via client wenn es nur ein stream wäre hätte ich es per taskkill gemacht aber bei 3 geht das nicht werden ja dann alle 3 beendet.

Bekommt nicht jeder prozess eine neue id zugewiesen wenn diese neu gestartet werden!

hier mal ein teil vom remote server code


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
var
myString : String;
buff : array[0..MAX_COMPUTERNAME_LENGTH] of char;
nsize : DWORD;
rc : hwnd;
begin
nsize := SizeOf(buff);
myString := Socket.ReceiveText;
Randomize();
if MyString = 'shotcast1' then
ShellExecute(Handle, 'open''haupt\sc_serv.exe'nilnil, SW_SHOWNORMAL)
else
if MyString = 'close1' then
taskkill('sc_serv.exe')
end;


und ein teil vom clienten


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
procedure TForm1.btn1Click(Sender: TObject);
begin
ClientSocket1.Socket.SendText('shotcast1');
end;

procedure TForm1.btn2Click(Sender: TObject);
begin
ClientSocket1.Socket.SendText('close1');
end;


so hätte ich es gemacht wenn es nur 1ner wäre


jaenicke - So 22.01.12 18:41

Naja, statt taskkill zu benutzen musst du eben die oben genannten Funktionen nehmen um den ganzen Pfad zu vergleichen.

Wobei ich mir relativ sicher bin, dass in der Funktion taskkill schon ähnlicher Code steckt. Du hast vermutlich nur noch nicht reingeschaut...


Petros - So 22.01.12 19:46

Das ist ja mal richtig cool DANKE für deine hilfe habe den taskkill jetzt mit pfad genommen und es funktioniert kann alle 3 jetzt einzellt beenden...


Narses - So 22.01.12 23:44

Moin!

Ähm, nur der Vollständigkeit halber für die Nachwelt, das hier ist kaputter Code:
user profile iconPetros hat folgendes geschrieben Zum zitierten Posting springen:
hier mal ein teil vom remote server code

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
var
myString : String;
buff : array[0..MAX_COMPUTERNAME_LENGTH] of char;
nsize : DWORD;
rc : hwnd;
begin
nsize := SizeOf(buff);
myString := Socket.ReceiveText;
Randomize();
if MyString = 'shotcast1' then
ShellExecute(Handle, 'open''haupt\sc_serv.exe'nilnil, SW_SHOWNORMAL)
else
if MyString = 'close1' then
taskkill('sc_serv.exe')
end;
Warum, ist in diesem FAQ-Beitrag [http://www.delphi-library.de/topic_Datenpakete+bei+den+SocketKomponenten+auseinanderhalten_56194.html] im Detail nachzulesen. :les: :think:

cu
Narses


Petros - Mo 23.01.12 15:17

Danke Narses.

Ich werde meinen Code nochmal überarbeiten habe das tut teilweise überflogen (grad keine zeit für) werde ich aber noch genauer durchgehen ich danke dir für die info.

MFG Petros