Entwickler-Ecke
Windows API - Indy in Konsolenanwendung
Savage - Fr 14.02.03 15:02
Titel: Indy in Konsolenanwendung
Hi @All
ich versuche gerade ein Serverprogramm (mit ner Form1) als Konsolenanwendung umzuschreiben. Aber wie bekomme ich jetzt die IDTCPServer-Komponente im Programm zum laufen?
Ich scheitere schon beim erstellen (weil es gibt ja keine Form) :(
ich hoffe, ihr könnt mir helfen.
mfg
Savage
Delete - Fr 14.02.03 15:26
Gar nicht. Da hilft nur ein nicht sichtbares Fenster.
AndyB - Fr 14.02.03 15:41
Luckie hat folgendes geschrieben: |
Gar nicht. Da hilft nur ein nicht sichtbares Fenster. |
Und warum sollte das nicht gehen? Die Indy-Komponenten binden in keinster Weise die Forms-Unit ein. Und in einigen Projekten von mir nutze ich die Indy-Komponente TIdHTTP und das ganze sogar in einer Konsolenanwendung.
Zitat: |
Ich scheitere schon beim erstellen (weil es gibt ja keine Form) |
Dann solltest du dich mal mit dem Erstellen von Komponenten zur Laufzeit auseinander setzen.
Savage - Fr 14.02.03 15:43
das Programm soll aber später mal auf nen Linux Server laufen und auf dem Server läuft kein X.
Würde das nicht zu Fehlern kommen?
Gibt es da noch eine andere Variante?
MfG
Savage
Delete - Fr 14.02.03 15:48
Muß da nicht ein Objekt als Parent angegeben werden? Aber ich lasse mich gerne eines besseren belehren.
Klabautermann - Fr 14.02.03 15:53
Hallo,
Savage hat folgendes geschrieben: |
das Programm soll aber später mal auf nen Linux Server laufen und auf dem Server läuft kein X.
Würde das nicht zu Fehlern kommen?
Gibt es da noch eine andere Variante? |
ich bin mir gar nicht sicher ob das Fehler gibt, denn der Unterschied zwischen Linux-Konsolenanwendungen und XWindow-Anwendungen ist bei weiten nicht so groß wie der zwischen Konsolenanwendungen (oder gar DOS anwendungen) und Windows-Anwendungen.
Ich würde an deiner stelle mal versuchen eine Linux Application ohne Formular aber mit DataModul zu erstellen. Lege irgendeine Unsichtbare Komponente auf dieses und gebe das Ergebnis einer Aktion mit dieser Komponente einfach per WirteLn aus.
Wenn das klappt dürfest du auch keine Probleme mit den Indys haben.
Ob es klappt kann ich nicht sagen, einen Versuch sollte es aber wert sein.
Gruß
Klabautermann
Savage - Fr 14.02.03 16:04
das Problem beim Erzeugen ist folgender:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| program Project2; {$APPTYPE CONSOLE} uses sysutils,IdBaseComponent, IdComponent, IdTCPServer,classes;
var
idtcpserver1 : TIDTCPserver;
begin
idtcpserver1 := TIDtcpserver.Create(AOWner:TComponent); |
Als AOwner:TComponent gebe ich ja im normalfall: self ein, welches jedoch bestandteil der Form ist. Ich komme also noch nicht zum erzeugen, weil ich jetzt nicht weis, was ich dort eintragen soll?
@AndyB
Darf ich fragen, wie du diese IDHTTP in deiner Konsolen-Anwendung erzeugt hast? Weil dann wäre mein Problem auch schon sogut wie gelöst :)
@Klabautermann
Mein Problem liegt z.Z. darin, dass ich nur Windowsrechner da stehen hab. An Kylix und Linux komm ich erst wieder in einer Woche ran. Somit kann ich z.Z. das nicht testen.
mfg
Savage
AndyB - Fr 14.02.03 16:23
Man muss keinen
Owner angeben. Wenn man dem Konstruktor
nil übergibt, hat er einfach keinen Owner, der ihn freigeben könnte. Somit musst du selbst dafür sorgen, dass die Instanz freigegeben wird.
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| program ReadHttpFile; uses Libc, IdHttp; var IdHttp: TIdHTTP; s: string; begin IdHttp := TIdHTTP.Create(nil); try s := IdHttp.Get('http://' + ParamStr(1)); finally IdHttp.Free; end; WriteLn(s); // nach StdOut schreiben end. |
Savage - Fr 14.02.03 16:27
misst, an nil hatte ich jetzt nun überhaupt nicht mehr dran gedacht :oops: .
vielen Dank AndyB und die anderen!
Ich werd dann mal schaun, ob es so funktioniert, wie ich es mir vorstelle.
MfG
Savage
AndyB - Fr 14.02.03 16:31
Wenn du unter Linux einen Server schreiben willst, dann wird dir folgender Code vielleicht helfen:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| program MyServer; uses Libc, MyServerUnit; begin if daemon(0, 0) = -1 then begin WriteLn('Es trat ein Fehler beim Starten des Servers auf.'); Exit; end;
StartServer; // steht in MyServerUnit und erzeugt die Komponenten. repeat Sleep(10); until False; end. |
Klabautermann - Fr 14.02.03 16:52
Hallo AndyB,
auch wenn wir jetzt etwas von Thema abweichen, aber dein letztes Posting finde ich sehr interessant.
Wenn ich das richtig verstehe, kann man so einen eigenen Demon schreiben.
Hast du dazu weitere Informationen (ein Tutorial)?
Außerdem würde mich interessieren wozu am ende die Endlosschleife:
Quelltext
1: 2: 3:
| repeat Sleep(10); until False; |
dient. Müsste man da nicht noch irgendwelchen Code zum Abarbeiten von Meldungen einfügen oder ähnliches?
Gruß
Klabautermann
AndyB - Fr 14.02.03 16:59
Die Endlosschleife dient nur dazu, dass der Deamon nicht beendet wird. Das Sleep() darin reduziert nur die Systemlast.
Natürlich könnte man in der Schleife die Abarbeitung durchführen, jedoch ist dies bei TIdTCPServer nicht notwendig.
All zu viele Informationen dazu habe ich nicht. Unter Linux einen Service (Deamon) zu schreiben ist nicht so schwer wie es unter Windows der Fall ist.
Um es nicht zu vergessen: Einen Deamon wird mit "# kill pid" beendet, wobei "pid" die ProcessID des Deamon ist.
AndyB - Fr 14.02.03 17:07
Noch was zu den Parameter der Funktion deamon:
NoChDir: Integer;
Bei 0 wird das Arbeitsverzeichnis auf / gesetzt. Dieser Parameter sollte immer 0 sein, da ansonsten Probleme mit mount/unmount auftreten können.
NoClose: Integer
Bei 0 wird stdin, stdout, stderr nach /dev/null umgeleitet.
Klabautermann - Fr 14.02.03 17:16
Danke,
sehr Spannend.
Gruß
Klabautermann
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!