|
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
ALWIM
Anmeldungsdatum: 08.08.2006 Beiträge: 1047 Wohnort: Niederbayern
|
Verfasst am: 03.11.2013, 03:08 Titel: Parameterübergabe an externe .exe Datei |
|
|
Ich habe eine Datei in der man zum Beispiel bestimmte Wörter als Befehl eingeben kann.
Ich möchte, wenn möglich dieser .exe Datei mit einem in Freebasic geschriebenen Programm jene Befehle mitteilen bzw. übermitteln.
Ich rufe das in Freebasic geschriebene Programm auf und das andere Programm erhält Befehle und führt sie aus, so als wenn ich die direkt in das andere Programm eingebe!
Mein Plan: http://www.shredderchess.de/schach-info/features/uci-universal-chess-interface.html
Wie geht das?
Ich weiß im Moment noch nicht wie der .exe Datei Befehle mitteilen kann?
Gruß
ALWIM _________________ SHELL SHUTDOWN -s -t 05 |
|
Nach oben |
|
|
St_W
Anmeldungsdatum: 22.07.2007 Beiträge: 955 Wohnort: Austria
|
|
Nach oben |
|
|
ALWIM
Anmeldungsdatum: 08.08.2006 Beiträge: 1047 Wohnort: Niederbayern
|
Verfasst am: 03.11.2013, 20:15 Titel: |
|
|
St_W hat Folgendes geschrieben: | Ein Blick in die Interface Beschreibung auf der verlinkten Seite und evt. ein weiterer in die Befehlsreferenz hätte deine Frage großteils beantwortet:
Interface Beschreibung hat Folgendes geschrieben: |
* all communication is done via standard input and output with text commands
| ; sprich: die Kommunkation läuft über stdin und stdout.
In FB werden allerdings bidirektionale Pipes nicht unterstützt, siehe http://www.freebasic-portal.de/befehlsreferenz/open-pipe-552.html
Ich würde es mit den Funktionen der C-RTL versuchen, ansonsten kannst du auch auf die Win32 API zurückgreifen (http://msdn.microsoft.com/en-us/library/windows/desktop/ms683231.aspx als Anfang). |
Ich glaube nicht, dass ein Blick meine Fragen beantwortet hätte!
Stehe noch immer auf den Schlauch! Mal schauen wie sich das realisieren lässt! Habe es noch nicht probiert!
Vielen herzlichen Dank für die Hilfe!
Gruß
ALWIM _________________ SHELL SHUTDOWN -s -t 05 |
|
Nach oben |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1235 Wohnort: Ruhrpott
|
Verfasst am: 04.11.2013, 02:20 Titel: |
|
|
Hallo,
ich habe gerade ein ähnliches Problem mit dem (Kommandozeilen-)Brennprogramm "cdrdao.exe" (Windows-Version), das sich standhaft weigert, seine Bildschirmausgabe woanders hinzuschicken als an sein eigenes Konsolenfenster. Es ignoriert sowohl den "... > G:\test\ausgabe.txt" - Parameter auf der Kommandozeile (erzeugt nur eine leere Datei) als auch den "Open Pipe..." - Befehl. Gibt es noch andere Möglichkeiten, die Ausgabe umzuleiten?
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
|
Roland Chastain
Anmeldungsdatum: 05.12.2011 Beiträge: 193 Wohnort: Frankreich
|
Verfasst am: 04.11.2013, 07:56 Titel: |
|
|
Hallo ! Hier es gibt ein FB Schachprogramm (mit Quellcode) wer verwendet Winboard Protokol :
Numpty chess
Es gibt also diese Code Beispiel wer verwendet UCI Protokol :
Fruit
English Forum |
|
Nach oben |
|
|
Sebastian Administrator
Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
|
Nach oben |
|
|
ALWIM
Anmeldungsdatum: 08.08.2006 Beiträge: 1047 Wohnort: Niederbayern
|
Verfasst am: 05.11.2013, 01:36 Titel: |
|
|
Roland Chastain hat Folgendes geschrieben: | Hallo ! Hier es gibt ein FB Schachprogramm (mit Quellcode) wer verwendet Winboard Protokol :
Numpty chess
Es gibt also diese Code Beispiel wer verwendet UCI Protokol :
Fruit
English Forum |
In der einen .bi Datei steht folgendes drin:
Code: | Îøèáêà óñòàíîâêè ïðàâà íå íàñëåäîâàíèÿ äåñêðèïòîðîâ äëÿ 1 ïàéïà |
da soll man sich auskennen!
Vielleicht kann das einer entziffern?
Mit dem Winboard-Protokoll kann ich nicht so viel anfangen!
Mein Ziel ist das UCI Protokoll!
So richtig schlau werde ich noch nicht draus?
Danke für den Link, der hilft mir schon ein wenig weiter! _________________ SHELL SHUTDOWN -s -t 05 |
|
Nach oben |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1235 Wohnort: Ruhrpott
|
Verfasst am: 05.11.2013, 02:38 Titel: |
|
|
@Sebastian: Volltreffer, es funktioniert! Vielen Dank für den Tip.
Jetzt müsste ich nur noch wissen, wie ich die Ausgabe statt in eine Datei in ein laufendes FB-Programm umleiten kann. Mit "Open Pipe..." geht das ja offensichtlich nicht. Und das Workaround über ein Auslesen der Ausgabedatei, während sie noch geschrieben wird, funktioniert zwar, ist aber nicht besonders elegant.
Hintergrund: Ich bastle gerade an einer "verify" - Funktion für "cdrdao" und möchte die Ausgabe des Programms in einer Ecke meines Fensters anzeigen.
(Entschuldigung, daß ich hier so vom Thema abschweife, aber ich möchte dafür nicht extra einen neuen Thread aufmachen).
Gruß
grindstone
EDIT: Ziehe nach gründlicher Lektüre des angegebenen Links meine letzte Frage reumütig zurück. Das Programm macht jetzt genau das, was ich möchte. Vielen Dank noch mal an Sebastian. _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
Zuletzt bearbeitet von grindstone am 05.11.2013, 23:22, insgesamt einmal bearbeitet |
|
Nach oben |
|
|
RockTheSchock
Anmeldungsdatum: 04.04.2007 Beiträge: 138
|
|
Nach oben |
|
|
Jojo alter Rang
Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 05.11.2013, 12:43 Titel: |
|
|
ALWIM hat Folgendes geschrieben: | In der einen .bi Datei steht folgendes drin:
Code: | Îøèáêà óñòàíîâêè ïðàâà íå íàñëåäîâàíèÿ äåñêðèïòîðîâ äëÿ 1 ïàéïà |
da soll man sich auskennen!
Vielleicht kann das einer entziffern? |
Das ist Text, der in einer kyrillischen ANSI-Codepage verfasst wurde, auf deinem System aber mit einer mitteleuropäischen Codepage dargestellt wird. "Übersetzen" in die richtigen Zeichen kann man das mit diesem Tool, raus kommt dabei "Ошибка установки пава не наследования дескиптоов для 1 пайпа" _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
|
|
Nach oben |
|
|
ALWIM
Anmeldungsdatum: 08.08.2006 Beiträge: 1047 Wohnort: Niederbayern
|
Verfasst am: 05.11.2013, 23:10 Titel: |
|
|
Ich kann deswegen nichts anfangen weil alle Schachengines UCI sind. Und ich will nicht extra Programme verwenden, nur damit diese letztendlich mit dem Programm laufen!
Ich weiß nicht, ob ich es schaffe, so ein Programm zu schreiben, dass Schachengines gegeneinander antreten? Aber ich werde es versuchen!
@Jojo: Danke für die Info, wusste nicht was das bedeuten soll! Habe es mir schon gedacht, dass das irgendwie mit Russisch zusammenhängt! Man lernt nie aus!
Edit:
Code: | ReadEngineInfo("id name")
Schachmotor = ReadEngineInfo()
LOCATE 5,5
PRINT Schachmotor |
Wenn ich obigen Code mit reinschreibe in das Programm, dann erhalte ich folgende Fehlermeldung:
Zitat: | Build error(s)
C:\Program Files (x86)\FreeBASIC\fbc -s gui "gui.bas"
gui.bas(216) error 7: Expected ')', found 'id name \n' in 'READENGINEINFO("id name")' |
Warum nur? Wollte den Namen der Engine auslesen!
Laut UCI Protokoll müsste das gehen:
Code: | Engine to GUI:
--------------
* id
* name
this must be sent after receiving the "uci" command to identify the engine,
e.g. "id name Shredder X.Y\n"
* author
this must be sent after receiving the "uci" command to identify the engine,
e.g. "id author Stefan MK\n" |
_________________ SHELL SHUTDOWN -s -t 05 |
|
Nach oben |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1235 Wohnort: Ruhrpott
|
Verfasst am: 06.11.2013, 10:24 Titel: |
|
|
@ALWIM: So wie ich das Protokoll verstanden habe, schickst du von der GUI aus den String "uci \n" zur Engine und bekommst dann von der Engine "id name [Enginename]" und noch etliche andere Informationen zurückgeschickt. Wie der String an die Engine übermittelt wird, entzieht sich leider meiner Kenntnis.
Ich habe mal drei nicht-russische Open Source - Engines herausgesucht,
http://www.glaurungchess.com/
http://arctrix.com/nas/chess/fruit/
https://github.com/Kojirion/blackWolf
vielleicht gibt die Analyse des Quelltextes ja irgendwelchen Aufschluss.
Ansonsten: Falls jemand mitliest, der darüber näheres weiß: Bitte melden, es würde mich auch interessieren.
Wenn die Engine per Tastatur gesteuert wird, kann dir vielleicht auch die WinApi-Funktion SendInput(... weiterhelfen, mit der sich Tastendrücke simulieren lassen.
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
|
ALWIM
Anmeldungsdatum: 08.08.2006 Beiträge: 1047 Wohnort: Niederbayern
|
Verfasst am: 07.11.2013, 03:46 Titel: |
|
|
In der einen C++ Datei steht drin:
Code: | void Engine::waitForOk()
{
toEngine("isready");
while (fromEngine()!="readyok"){
}
}
|
Der Befehl
ist bei dem Freebasicprogramm:
Code: | WriteEngineInfo("uci") |
So sieht das Gegenstück in C++ aus:
Code: | (fromEngine()!="readyok") |
Bei meinem Programm funktioniert dies nicht:
Code: | ReadEngineInfo("id name") |
Der entsprechende C++ Quellcode: https://github.com/Kojirion/blackWolf/blob/072b873cc6fdee7d4f23f1ea3cee55f32965f792/Engine.cpp
(Die Befehle) toEngine und fromEngine sind nirgendswo definiert in den Dateien.
Vielleicht habe ich da was übersehen?
Ich kann den Namen der Schachengine nicht auslesen? Keine Ahnung was man da schreiben muss, damit das funktioniert!
Ich wollte den Namen der Schachengine auslesen und mit Print auf dem Bildschirm anzeigen lassen.
http://free-basic.ru/chess_fruit.html _________________ SHELL SHUTDOWN -s -t 05 |
|
Nach oben |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1235 Wohnort: Ruhrpott
|
Verfasst am: 07.11.2013, 10:35 Titel: |
|
|
ALWIM hat Folgendes geschrieben: |
(Die Befehle) toEngine und fromEngine sind nirgendswo definiert in den Dateien.
Vielleicht habe ich da was übersehen? |
Ja, hast du:
Code: | void toEngine(const std::string toPut);
std::string fromEngine();
| in "Engine.hpp".
Aber es ist eigentlich unnötig, sich durch die ganzen C++ - Sources zu kämpfen. Ich habe das "Fruit"-Paket einmal heruntergeladen und es mir angesehen. Der russische Kollege hat zwar einen etwas eigenwilligen Programmierstil, die Arbeitsweise des Programms ist aber recht gut nachvollziehbar.
ALWIM hat Folgendes geschrieben: |
Bei meinem Programm funktioniert dies nicht:
Code:
ReadEngineInfo("id name")
| Natürlich funktioniert das nicht. Mit "ReadEngineInfo()" wird Text nicht geschrieben, sondern gelesen. Versuch es mal so: Code: | Dim As String g
WriteEngineInfo("uci")
g = ReadEngineInfo()
Print g | Zum tieferen Verständnis solltest du dir die "connect_engine.bi" einmal genauer ansehen (oder sollte ich besser sagen: durcharbeiten?).
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
|
ALWIM
Anmeldungsdatum: 08.08.2006 Beiträge: 1047 Wohnort: Niederbayern
|
Verfasst am: 07.11.2013, 11:37 Titel: |
|
|
Zitat: | Natürlich funktioniert das nicht. Mit "ReadEngineInfo()" wird Text nicht geschrieben, sondern gelesen. Versuch es mal so: |
Das ist ja genau das was ich will! Lesen. Namen der Engine auslesen!
Code: | Dim As String g
WriteEngineInfo("uci")
g = ReadEngineInfo()
Print g |
Damit zeigt er auch keinen Namen an. Auch wenn ich "id Name" reinschreibe. Auf dem Bildschirm wird nur err angezeigt. Auch den Namen des Programmierers kann ich nicht auslesen.
Das muss doch zum schaffen sein? _________________ SHELL SHUTDOWN -s -t 05 |
|
Nach oben |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1235 Wohnort: Ruhrpott
|
Verfasst am: 07.11.2013, 12:03 Titel: |
|
|
Gemäß UCI-Standard sollte die Engine auf "uci" hin ihre id und ihren Namen zurückmelden. Tut sie aber nicht, zumindest nicht die "Fruit-2-3-1.exe". Die anderen Befehle scheinen zu funktionieren, zumindest soweit ich sie ausprobiert habe. Vielleicht solltest du es mal mit einer anderen Engine probieren.
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
|
ALWIM
Anmeldungsdatum: 08.08.2006 Beiträge: 1047 Wohnort: Niederbayern
|
Verfasst am: 07.11.2013, 13:29 Titel: |
|
|
Das macht keine der Engines die ich habe!
mit Code: | WriteEngineInfo("uci") | kann man auch keinen Enginenamen auslesen! Laut UCI-Protokoll kann man das nur mit ReadEngineInfo? _________________ SHELL SHUTDOWN -s -t 05 |
|
Nach oben |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1235 Wohnort: Ruhrpott
|
Verfasst am: 08.11.2013, 01:23 Titel: |
|
|
Ich beziehe mich auf die Angaben in http://wbec-ridderkerk.nl/html/UCIProtocol.html. Danach bedeutet Code: | WriteEngineInfo("uci") | soviel wie: "Schalte in den uci-modus und mir sage mir, wer du bist". Und mit Code: | Print = ReadEngineInfo() | kann man dann abrufen, was die Engine daraufhin antwortet.
Wenn sie das nicht tut, gibt es zwei Möglichkeiten: Entweder das Protokoll wurde geändert (wofür ich nirgendwo einen Anhaltspunkt gefunden habe) oder die Engine wurde unsauber programmiert.
Du könntest die "Fruit-2-3-1.exe" mal in einen Hex-Editor laden und nach einem entsprechenden Namensstring suchen, der muß ja irgendwo im Programm drinstehen.
Ansonsten könntest du dir auch den Quellcode einer Open-Source-Engine vornehmen, um herauszufinden, mit welchem Befehl man sie eventuell dazu bewegen könnte, ihren Namen preiszugeben.
Für mich sieht es jedenfalls so aus, als ob die "Fruit-2-3-1.exe" den Befehl "uci" überhaupt nicht kennt.
EDIT: Wenn du die "Fruit-2-3-1.exe" normal als Programm in einem DOS-Fenster startest und dann "uci" eintippst, bekommst du die gewünschten Informationen - und noch eine Menge mehr. Vielleicht hilft dir das ja weiter.
EDIT 2: Der Fehler liegt eindeutig in der "connect_engine.bi". Die Pipes funktionieren nicht, auch nicht mit anderen Programmen.
EDIT 3: Der Fehler liegt in der "ReadEngineInfo()".
Wenn du sie durch Code: | Function ReadEngineInfo() As String
Dim As Integer iTotalBytesAvail,iNumberOfBytesWritten
Dim As String sRet,sBuf
sBuf = String(10000,Chr(0))
PeekNamedPipe(hReadPipe,NULL,NULL,NULL,@iTotalBytesAvail,NULL)
If iTotalBytesAvail Then
ReadFile(hReadPipe,StrPtr(sBuf),iTotalBytesAvail,@iNumberOfBytesWritten,NULL)
EndIf
Return sBuf
End Function | ersetzt, bekommst du eine Rückmeldung von der Engine (und wirst feststellen, daß sie ziemlich geschwätzig ist). Die Formatierung der Ausgabe überlasse ich dir. Viel Spaß damit.
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
|
ALWIM
Anmeldungsdatum: 08.08.2006 Beiträge: 1047 Wohnort: Niederbayern
|
Verfasst am: 08.11.2013, 14:11 Titel: |
|
|
Zitat: | Für mich sieht es jedenfalls so aus, als ob die "Fruit-2-3-1.exe" den Befehl "uci" überhaupt nicht kennt. | Fruit muss den Befehl UCI kennen, da ich die im Fritz 12 verwenden kann! Das geht nur mit UCI Engines!
Zitat: | Du könntest die "Fruit-2-3-1.exe" mal in einen Hex-Editor laden und nach einem entsprechenden Namensstring suchen, der muß ja irgendwo im Programm drinstehen.
Ansonsten könntest du dir auch den Quellcode einer Open-Source-Engine vornehmen, um herauszufinden, mit welchem Befehl man sie eventuell dazu bewegen könnte, ihren Namen preiszugeben. |
Brauche ich nicht, da ich den Quellcode von Fruit auf meinem Rechner irgendwo habe!
Zitat: | Der Fehler liegt eindeutig in der "connect_engine.bi". Die Pipes funktionieren nicht, auch nicht mit anderen Programmen. |
Das habe ich mir schon gedacht!
Zitat: | EDIT 3: Der Fehler liegt in der "ReadEngineInfo()".
Wenn du sie durch
Code: | Code:
Function ReadEngineInfo() As String
Dim As Integer iTotalBytesAvail,iNumberOfBytesWritten
Dim As String sRet,sBuf
sBuf = String(10000,Chr(0))
PeekNamedPipe(hReadPipe,NULL,NULL,NULL,@iTotalBytesAvail,NULL)
If iTotalBytesAvail Then
ReadFile(hReadPipe,StrPtr(sBuf),iTotalBytesAvail,@iNumberOfBytesWritten,NULL)
EndIf
Return sBuf
End Function |
ersetzt, bekommst du eine Rückmeldung von der Engine (und wirst feststellen, daß sie ziemlich geschwätzig ist). Die Formatierung der Ausgabe überlasse ich dir. Viel Spaß damit. grinsen
Gruß
grindstone |
Dann werde ich das mal probieren! Hoffentlich sehe ich jetzt mehr. Am UCI-Protokoll wurde nichts mehr geändert! Das ist die aktuelle Version!
Vielen herzlichen Dank schon mal für die Hilfe!
Edit: Funktioniert das bei dir? Ich bekomme eine Fehlermeldung bzw. es werden keine Züge mehr ausgeführt! Gui (Programm) wird geschlossen!
Angezeigt wird bei mir auch nichts. Welchen Quellcode hast du, damit er was anzeigt?
?????? _________________ SHELL SHUTDOWN -s -t 05 |
|
Nach oben |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1235 Wohnort: Ruhrpott
|
Verfasst am: 08.11.2013, 17:27 Titel: |
|
|
Entschuldigung, das hätte ich dazuschreiben sollen: Der angegebene Code ist kein funktionierender Ersatz für die Original-Function, sondern nur ein "quick and dirty" zusammengestellter Notbehelf, um die Startmeldung der Engine auslesen zu können. Im Augenblick ist z.B. jeder zurückgegebene String 10000 Zeichen lang. Sieh es dir am besten selbst an. Füge dazu die Zeilen Code: | Dim As String g
Do
WriteEngineInfo("uci")
Sleep 1000
g = ReadEngineInfo()
Print Left(g,InStr(g,Chr(0))-1);
Sleep
Loop | am Anfang der "gui.bas" zwischen "Using fb" und "ScreenRes 640,480,32" ein. Dann setze die Bildpuffergröße deines DOS-Fensters auf 250 Zeilen und kompiliere und starte die "gui.bas" als Konsolenprogramm.
Und dann mach dir in aller Ruhe Gedanken darüber, wie man diesen Datenwust bändigen kann.
Die ursprüngliche "ReadEngineInfo()" gibt -soweit ich das beurteilen kann- immer nur die 5 Zeichen zurück, die auf das Wort "bestmove " folgen - oder eben ein "err". Wenn du eine vollständige normgerechte Kommunikation möchtest, mußt du also noch etwas Arbeit in die Neuprogrammierung der Funktion investieren. Das überlasse ich dir, da du dich mit dem uci - Protokoll wesentlich besser auskennen dürftest als ich (Schließlich wußte ich vor einer Woche nicht einmal, daß es sowas überhaupt gibt).
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
|
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|