Definieren von Pipes in IDL-Dateien
Wenn eine Pipe in einer IDL-Datei definiert ist, generiert der MIDL-Compiler eine Pipesteuerungsstruktur, deren Member Zeiger auf Push-, Pull- und Alloc-Prozeduren sowie eine Zustandsvariable sind, die diese Prozeduren koordiniert. Die Clientanwendung initialisiert die Felder in der Pipesteuerungsstruktur, verwaltet ihre Zustandsvariable und verwaltet die Datenübertragung mit ihren eigenen Push-, Pull- und Alloc-Funktionen. Der Clientstubcode ruft diese Anwendungsfunktionen während der Datenübertragung in Schleifen auf. Bei einer Eingabepipe marshallt der Clientstub die Übertragungsdaten und überträgt sie an den Serverstub. Bei einer Ausgabepipe hebt der Clientstub die Daten in einen Puffer auf und übergibt einen Zeiger auf diesen Puffer zurück an die Clientanwendung.
Der Serverstubcode initialisiert die Felder der Pipesteuerungsstruktur in einer Zustandsvariablen sowie Zeiger auf Push- und Pullroutinen. Der Serverstub verwaltet den Zustand und verwaltet seinen privaten Speicher für die Übertragungsdaten. Die Serveranwendung ruft die Pull- und Pushroutinen während des Remoteprozeduraufrufs in Schleifen auf, wenn sie Daten vom Clientstub empfängt und auflöst, oder marshallt und Daten an den Clientstub überträgt.
Die folgende IDL-Beispieldatei definiert einen Pipetyp LONG_PIPE, dessen Elementgröße als long definiert ist. Außerdem werden Funktionsprototypen für die Remoteprozeduraufrufe InPipe und OutPipe deklariert, um Daten zu senden bzw. zu empfangen. Wenn der MIDL-Compiler die IDL-Datei verarbeitet, generiert er die im Beispiel gezeigte Headerdatei.
Beispiel
// File: pipedemo.idl
typedef pipe long LONG_PIPE;
void InPipe( [in] LONG_PIPE pipe_data );
void OutPipe( [out] LONG_PIPE *pipe_data );
//end pipedemo.idl
// File: pipedemo.h (fragment)
// Generated by the MIDL compiler from pipedemo.idl
typedef struct pipe_LONG_PIPE
{
void (__RPC_FAR * pull) (
char __RPC_FAR * state,
long __RPC_FAR * buf,
unsigned long esize,
unsigned long __RPC_FAR * ecount );
void (__RPC_FAR * push) (
char __RPC_FAR * state,
long __RPC_FAR * buf,
unsigned long ecount );
void (__RPC_FAR * alloc) (
char __RPC_FAR * state,
unsigned long bsize,
long __RPC_FAR * __RPC_FAR * buf,
unsigned long __RPC_FAR * bcount );
char __RPC_FAR * state;
} LONG_PIPE;
void InPipe(
/* [in] */ LONG_PIPE pipe_data);
void OutPipe(
/* [out] */ LONG_PIPE __RPC_FAR *pipe_data);
//end pipedemo.h
Zugehörige Themen