文章目录
概述:windows 创建 RPC调用过程实例详解
[toc]
相关参考文章
0x01、生成 UUID 和模版(IDL)文件
定义接口的第一步是使用 uuidgen 实用工具生成通用唯一标识符(UUID)。UUID使客户端和服务端能够相互识别。该工具包含在阿庄平台软件开发工具包中(SDK)。
一般安装路径位于:D:\Windows Kits\10\bin\10.0.22621.0\x64
以下命令生成 UUID 并创建名为 Hello.idl 的模版文件。
1 | uuidgen /i /ohello.idl |
模版内容大致如下:
1 | [ |
在模版中添加接口:
1 | //file hello.idl |
0x02、添加 acf 文件
acf文件内容如下所示,导出接口需要与 idl 文件一致:
1 | //file: hello.acf |
0x03、编译 idl 文件
-
打开 visual studio,新建一个空项目
-
空项目中添加上述 idl文件 和 acf文件
-
编译项目
-
生成 hello_h.h、hello_c.c、hello_s.c
- hello_h.h: 服务端和客户端共用文件
- hello_c.c: 客户端文件
- hello_s.c: 服务端文件
需要补充说明的是,在 hello_h.h 头文件中有两个导出接口,导出接口即为rpc调用的接口。
1
2extern RPC_IF_HANDLE hello_v1_0_c_ifspec;
extern RPC_IF_HANDLE hello_v1_0_s_ifspec;
包含函数
函数MIDL_user_allocate和MIDL_user_free用于为RPC存根分配和释放内存。
MIDL_user_allocate和MIDL_user_free在实现RPC应用程序时,它们必须在应用程序的某个地方定义,这里直接在主文件定义即可。
1 | //在客户端和服务端实现中都要包含这两个函数 |
0x04、客户端
新建工程文件如下所示:
clientrpc.cpp
1 | //client.cpp |
0x05、服务端
新建工程文件如下所示:
serverrpc.cpp
1 |
|
0x06、编译并运行
分别编译客户端和服务端程序,得到 server.exe 和 client.exe
- 先运行 server.exe
- 在 client.exe 目录运行
client -ip 192.168.106.128来启动客户端程序并与服务器端相连 - 在 client 的窗口输入任意字符串,回车后可看到server窗口上有显示
- 在 client 窗口内 输入 exit 或 quit, server 窗口关闭
0x07、运行示例
Client
Server