ein Programm soll das andere steuern

Kimble

Erfahrenes Mitglied
hi,
ich hab ein OpenGL Programm (in C) wo es eine Variable numbers gibt.
Diese Variable soll durch ein anderes Programm (GTK+, also auch in C) veraendert werden.

Also wenn OpenGL startet und numbers ist 500, soll in dem GTK+ Programm dann ueber ein Texteingabefeld die Variable veraendert werden koennen (z.b. in 600).

Wie kann man so etwas realisieren, da es ja 2 getrennte Programme sind, also nicht auf eine Variable zugreifen koennen.
Soll ich ne txt File nehmen da die Zahl reinschreiben lassen und die dann von dem openGL Programm alle Sekunde auslesen lasse.
Oder soll ich die Variable direkt im Arbeitsspeicher editieren, wobei ich da das Problem habe das ich nicht an die Adresse komm.

Kennt jemand ne Loesung fuer das Problem???

danke fuer jede Antwort :(
 
Es kommt ganz darauf an, unter welchem Betriebssystem Du programmierst. Ich perönlich würde unter Windows eine Named-Pipe nehmen und unter Linux einen Port aufsetzen.

MfG

Tobas
 
also so wie ich das bis jetzt verstanden hab (verbesser mich bitte, wenn was falsch ist):

- mit CreateNamedPipe oeffnet man ein HANDLE Handle1 um eine neue Pipe zu erzeugen (char *pipeAdult = "\\\\.\\pipe\\pipe2"; - ist dann z.b. der PipeName)

- mit CreateFile erstellt man ein HANDLE Handle2 um in die Pipe was zu schreiben

- mit der Funktion WriteFile(Handle2, ....) kann man in die Pipe was schreiben

- mit der Funktion ReadFile(Handle1, ....) liest man die Daten aus der Pipe aus


nut kapier ich noch nicht so genau, wie dass mit dem schreiben und lesen geht. An welche Stelle bei Read-/WriteFile kommen die Daten, die geschrieben werden sollen?
und wie kann man bei 2 verschiedenen Programmen die Pipes benutzen?
Dann muesste ich doch eigentlich im 2. Programm wieder eine neue Pipe erstellen, die auch mit char *pipeAdult = "\\\\.\\pipe\\pipe2"; initialisiert wird, und dann ueber ReadFile() die Daten wieder einlesen.

Stimmt das soweit???
Danke dir schonmal im vorraus :)
 
Also einmal ganz kurz zu den vielen \ -> aufpassen, das liegt an c++, da der Compiler aus \\ immer \ macht.

Ansonsten hast Du grob recht. Mit CreateNamedPipe wird eine neue Pipe erstellt, die dann das andere Programm über CreateFile öffnet - unter Windows wird nämlich ganz vieles wie eine Datei behandelt, auch wenn es keine ist (frag micht bitte nicht, warum es dann nicht OpenFile heißen muss). Nun kannst Du eben über WriteFile und ReadFile lustig alles nach dem FIFO-Prinzip hin und her schieben.

MfG

Tobias

PS: unter http://www.adp-gmbh.ch/misc/ipc/named_pipes.html findet man das einmal mit Server und Client. Aber achtung: der hat so weit ich das sehe bei den \ einen Fehler gemacht - die müssten eigentlich immer doppelt da stehen.
 
DANKE!!!

Das Problem hab ich schon ueber die IBM Seite (weiter oben) geloest.
Danke dass du erst mal die Idee gebracht hast, das so zu machen :)

Wenn ich noch fragen hab, schick ich dir grad ne PM :)

// edit: jo, da muss eigentlich \\\\.\\pipe\\xxx stehen
 
Zuletzt bearbeitet:
hi,
noch ne kleine Frage:
gehen named Pipes auch unter C oder nur unter C++, weil GTK+ Anwendungen sind ja reiner C Code?
 
Die kannst Du unter allen Programmier-Sprachen nutzen, die die stdcall-Konventionen und Dll unterstützen (wie alle Win32-Funktionen). Also auch C, Deplhi, VB usw.

MfG

Tobias
 
so,
jetzt wollt ich das ganze in C machen, aber irgendwie klappt das nicht.
hier der Code:
Code:
#include <windows.h>
#include <process.h>
#include <stdio.h>

int main() {

    char *pipeAdult = "\\\\.\\pipe\\pipe2";
    char bufIn[1000];
    char ans;
    DWORD nofRead, nofWritten;
    HANDLE hPipe;

    hPipe = CreateNamedPipe(pipeAdult,
                            PIPE_ACCESS_DUPLEX,
                            PIPE_TYPE_BYTE,
                            1,
                            0,
                            0,
                            INFINITE,
                            NULL);

    if(hPipe = INVALID_HANDLE_VALUE) {
        printf("CreateNamedPipe() FAILED: err=%d\n", GetLastError());
        return 1;
    }

    ConnectNamedPipe(hPipe,
                     0);

    while(1) {
        ReadFile(hPipe, bufIn, sizeof(bufIn), &nofRead, NULL);

        bufIn[nofRead] = 0;
        printf("Client: %s\n", bufIn);

        printf(">");
        scanf("%s", ans);

        WriteFile(hPipe, &ans, sizeof(ans), &nofWritten, 0);
    }

    return 0;
}

aber wenn ich das dann starten will kommt immer die Meldung:
CreateNamedPipe() FAILED: err=0

Woran liegt das?
 
Zurück