interaktion zwischen 2 programmen

das klingt schonmal nich schlecht, was in der msdn steht. Das Problem ist, ich habe noch nie mit Handles gearbeitet. Kennt jemand ein leicht zu verstehendes Tutorial dazu? (möglichst in deutsch)
 
Da ist kein großes Geheimnis dahinter. Ein Handle ist lediglich eine eindeutige Identifikationsnummer, in diesem Fall für einen Datenkanal. Es ist der gleiche Typ Handle, wie Du ihn von CreateFile(...) zurückbekommst. Das Handle, das Du mit CreateNamedPipes(...) bekommst, gibst Du dann beim Aufruf von WriteFile(...) als ersten Parameter an, damit die Funktion weiß, in welche Datei (oder Pipe, oder COM-Schnittstelle,...) die Daten geschrieben werden soll.
 
Nein, named pipes kannst Du auf jedem (neueren) Windows verwenden, ich glaube, in jedem 32-Bit Windows (und natürlich 64-Bit).
Dann iss meine MSDN vom letzten Jahrtausend :)

Ok, ich werds mal probieren, danke fuer den Hinweiss ...

Ciao ...
 
Sag' mir dann bitte, ob's auch wirklich geht :). Da es schon ne Weile her ist, daß ich sowas gemacht habe, weiß ich nicht mehr, auf welchem Windows das war. In meiner MSDN steht auf jeden Fall keine Einschränkung.
 
also ich hab das jetzt soweit probiert:

im ersten Programm hab ich die Pipe folgendermaßen erstellt:

Code:
HANDLE pipe1 = CreateNamedPipe("\\\\.\\pipe\\pipe1", PIPE_ACCESS_DUPLEX, PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE | PIPE_WAIT, 5, 500, 500, NMPWAIT_USE_DEFAULT_WAIT, NULL);

im zweiten Programm hab ich dann folgendes geschrieben:

Code:
DWORD bytes;
LPTSTR input;
LPTSTR output;
output = "test";
CallNamedPipe("\\\\.\\pipe\\pipe1", input, 500, output, 5*sizeof(TCHAR), &bytes, NMPWAIT_NOWAIT)

dann hab ich im ersten Programm zum Pipe connected:

Code:
ConnectNamedPipe(pipe1, NULL)

nun weiß ich allerdings nicht, wie ich die Nachricht vom prog2 im prog1 abfange. Wäre schön, wenn mir jemand weiterhelfen könnte oder mich auf Fehler hinweißt, die ich eventuell im obigen Code gemacht habe.
 
Mit WaitForSingleObject(HANDLE hHandle, DWORD dwMilliseconds) müsstest Du auf das Eintreffen von Daten aus der Pipe warten können. Das kannst Du in einem eigenen Thread machen (mit Timeout INFINITE) oder in einer Schleife mit einem Timeout von ein paar Millisekunden.
Die Pipe ist zwar in der Beschreibung von WaitForSingleObject nicht aufgeführt, aber bei mir geht es. Allerdings habe ich in meiner aktuellen Anwendung keine NamedPipe sondern eine Namenlose.
 
ich habs leider noch immernich hinbekommen. Kann mir jemand mal die Reihenfolge sagen, in der ich die verschiedenen Befehle aufrufen muss?

zuerst muss ich mit Sicherheit beim Server CreateNamedPipe() aufrufen und dann?

ich hab als nächstes mit system(dateiname) das zweite Programm (Client) gestartet und dort wird CallNamedPipe() aufgerufen. Danach wird im Server erst ConnectNamedPipe() und dann ReadFile() aufgerufen. Ist diese Reihenfolge korrekt, denn irgendwie will das nicht funktionieren?
 
ich hab mal probiert den Fehler einzugrenzen. Das Erstellen der Pipe vom Server mit CreateNamedPipe() funktioniert soweit ich weiß. Der Fehler muss also beim Client liegen, beim Senden einer Message kommt immer eine Fehlermeldung.
Hier mal ein Ausschnitt vom Client-Quellcode:

Code:
HANDLE HPipe;
HPipe = CreateFile("\\\\.\\pipe\\pipe1", FILE_ALL_ACCESS, FILE_SHARE_READ | 
			 FILE_SHARE_WRITE,  NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,
			 NULL);
LPDWORD writtenbytes;
WriteFile(HPipe,"Test",5,writtenbytes,NULL);

Die Fehlermeldung die erscheint lautet:
"Zugriffsverletzung bei Adresse 7C810FB4 in Modul 'kernel32.dll'. Schreiben von Adresse 77D291FF"

Weiß jemand was ich eventuell falsch gemacht habe?
 
wäre auch nett, wenn mir mal jemand kurz erklären könnte, wie das mit den Threads funktioniert. Brauch ich im prog1 unbedingt einen Thread für das Warten auf die Message von prog2? Habe nur mal kurz in Java mit Threads gearbeitet, aber nich sehr viel. danke
 
Ich glaub ich werd mich jetzt nochmal ganz langsam an das Thema pipes heranarbeiten. Eine Frage habe ich aber schon: Ich hab erstmal nur versucht eine Verbindung zwischen zwei Programmen über eine pipe herzustellen, ohne dass irgendwelche Daten gesendet werden. Dies funktioniert soweit, aber leider nur, wenn ich das zweite Programm manuell starte. Wenn ich es aus dem ersten heraus mit system() starte, funktioniert es nicht, da kommt der Error-Code 232 (ERROR_NO_DATA - The pipe is being closed).
 

Neue Beiträge

Zurück