IDL 파일에서 파이프 정의

파이프가 IDL 파일에 정의되면 MIDL 컴파일러는 이러한 프로시저를 조정하는 상태 변수뿐만 아니라 밀어넣기, 끌어오기 및 할당 프로시저에 대한 포인터인 파이프 컨트롤 구조를 생성합니다. 클라이언트 애플리케이션은 파이프 제어 구조의 필드를 초기화하고, 상태 변수를 유지 관리하며, 자체 푸시, 끌어오기 및 할당 함수를 사용하여 데이터 전송을 관리합니다. 클라이언트 스텁 코드는 데이터 전송 중에 루프에서 이러한 애플리케이션 함수를 호출합니다. 입력 파이프의 경우 클라이언트 스텁은 전송 데이터를 마샬링하고 서버 스텁으로 전송합니다. 출력 파이프의 경우 클라이언트 스텁은 데이터를 버퍼로 숨기지 않고 해당 버퍼에 대한 포인터를 클라이언트 애플리케이션에 다시 전달합니다.

서버 스텁 코드는 파이프 컨트롤 구조의 필드를 상태 변수로 초기화하고 푸시 및 끌어오기 루틴에 대한 포인터를 초기화합니다. 서버 스텁은 상태를 유지하고 전송 데이터에 대한 프라이빗 스토리지를 관리합니다. 서버 애플리케이션은 클라이언트 스텁에서 데이터를 수신 및 언마샬링하거나 데이터를 마샬링하고 클라이언트 스텁으로 전송할 때 원격 프로시저 호출 중에 루프에서 끌어오기 및 푸시 루틴을 호출합니다.

다음 예제 IDL 파일은 요소 크기가 long으로 정의된 파이프 형식 LONG_PIPE 정의합니다. 또한 원격 프로시저 호출 InPipe 및 OutPipe에 대한 함수 프로토타입을 선언하여 데이터를 각각 보내고 받습니다. MIDL 컴파일러는 IDL 파일을 처리할 때 예제에 표시된 헤더 파일을 생성합니다.

예제

// 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

파이프

/Oi