Windows RPC 원격 프로세스 호출(1): 기본
1단계: IDL(Interface Description Language, 인터페이스 설명 언어) 파일 작성
test.idl
[
uuid("9B26A55E-6DCD-4988-B83C-C6171F1DF5AC"),
version(1.0)
]
interface HelloWorld
{
//
int intAdd(int x, int y);
}
옵션으로 제공되는 파일은 RPC 인터페이스를 구성하는 응용 프로그램 구성 파일(.acf)입니다.
test.acf
[
implicit_handle(handle_t test_Binding)
]
interface HelloWorld
{
}
VC 또는 VS 명령줄에서 다음 명령을 실행하는 IDL 파일을 컴파일합니다.
midl test.idl
그리고 테스트가 발생합니다.h、test_c.c、test_s.c 몇 개의 파일, 각각 헤더 파일, 클라이언트 파일, 서버 사이드 파일입니다.
2단계: 서버 측 프로그램 작성
새 win32 컨트롤러 프로그램, 파일 서버 추가.c:
#include<windows.h>
#include <stdlib.h>
#include <stdio.h>
#include "test.h"
int intAdd( int x, int y)
{
printf("%d + %d = %d
", x, y, x+y);
return x+y;
}
int main(int argc,char * argv[])
{ // tcp ,13521
RpcServerUseProtseqEp((unsigned char *)"ncacn_ip_tcp", RPC_C_PROTSEQ_MAX_REQS_DEFAULT,
(unsigned char *)"13521", NULL);
// ,HelloWorld_v1_0_s_ifspec test.h
RpcServerRegisterIf(HelloWorld_v1_0_s_ifspec, NULL, NULL);
// ,
RpcServerListen(1,20,FALSE);
return 0;
}
// ,
void __RPC_FAR* __RPC_USER midl_user_allocate(size_t len)
{
return(malloc(len));
}
void __RPC_USER midl_user_free(void __RPC_FAR *ptr)
{
free(ptr);
}
메뉴 프로젝트 - 설정 - 링크 - 대상 모듈에 rpcrt4를 추가합니다.lib.
test.h、test_s.c 이 두 파일도 서버 프로젝트에 추가됩니다.
그리고 컴파일하면 실행할 수 있습니다.
3단계: 클라이언트 프로그램 작성
마찬가지로 프로젝트client를 구축합니다.
메뉴 프로젝트 - 설정 - 링크 - 대상 모듈에 rpcrt4를 추가합니다.lib.
test.h、test_c.c 이 두 파일도client 프로젝트에 추가됩니다.소스 파일 클라이언트 추가.c:
#include <windows.h>
#include <stdlib.h>
#include <stdio.h>
#include "test.h"
int main()
{
unsigned char * pszStringBinding = NULL;
int x, y, rval;
RpcStringBindingCompose(
NULL,
(unsigned char*)"ncacn_ip_tcp",
(unsigned char*)"localhost" /*NULL*/,
(unsigned char*)"13521",
NULL,
&pszStringBinding
);
// , test.acf , test_Binding
RpcBindingFromStringBinding(pszStringBinding, & test_Binding );
//
RpcTryExcept
{
while(1)
{
printf("Input two integer: ");
scanf("%d %d", &x, &y);
rval = intAdd(x, y);
printf("%d
", rval);
}
}
RpcExcept(1)
{
printf( "RPC Exception %d
", RpcExceptionCode() );
}
RpcEndExcept
//
RpcStringFree(&pszStringBinding);
RpcBindingFree(&test_Binding);
return 0;
}
// ,
void __RPC_FAR* __RPC_USER midl_user_allocate(size_t len)
{
return(malloc(len));
}
void __RPC_USER midl_user_free(void __RPC_FAR *ptr)
{
free(ptr);
}
컴파일하여 실행하면 됩니다.
프로그램 기능:
클라이언트에서 정수 2개를 입력하면 서버가 합을 계산하고 되돌아옵니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
제한된 크기의 디렉토리를 만드는 방법오늘 저는 장치에 공간이 없을 때 백업 중에 응용 프로그램이 어떻게 작동하는지 테스트(및 수정)하는 작업이 있습니다. 결과적으로 "남은 공간 없음"오류로 백업이 실패하면 새 파일이 없어야 합니다. 지금까지 문제를 재...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.