开发环境:
- VS2019 社区版(16.11.4)
- Windows 10 企业版 LTSC(1809)【PVE 虚拟机】
git clone https://gitee.com/lch0821/RpcDemo.git双击 RpcDemo.sln 打开工程,右键,选择 生成解决方案(快捷键:Ctrl+Shift+B)。
进入项目目录下的 Debug,先打开 Server.exe,再打开 Client.exe,即可看到消息发送情况。
也可以分别在两个命令窗口里执行 Server.exe 和 Client.exe。
V1 实现了由 Client 向 Server 发送字符串,IDL 文件如下:
[
uuid(50C2504F-1062-4CC3-B9F1-9329A3BE82F9),
version(1.0),
implicit_handle(handle_t hDemoBinding)
]
interface demo
{
import "demo.h";
int SendString([in, string] const wchar_t* msg);
void Shutdown(void);
}V2 实现了由 Client 向 Server 发送字符串并获取字符串,IDL 文件新增:
int GetString([in, string] const wchar_t* inStr, [out, string] wchar_t outStr[128]);V3 实现了由 Client 向 Server 发送字符串并获取字符串,IDL 文件新增:
typedef struct RPCSTRING {
unsigned long size;
[ ptr, size_is(size), length_is(size) ] wchar_t str[*];
} RPCSTRING_t;
typedef RPCSTRING_t* PRPCSTRING;
int GetVarString([ in, string ] const wchar_t *inStr, [ out ] PRPCSTRING *outStr);V4 实现了由 Client 向 Server 发送字符串并获取字符串,IDL 文件新增:
typedef RPCSTRING_t** PPRPCSTRING;
int GetVarStringList([ in, string ] const wchar_t *inStr, [out] int *pNum,
[ out, size_is(, *pNum) ] PPRPCSTRING *outStrList);V5 实现了由 Client 向 Server 获取 contact 结构体(整型和字符串),IDL 文件新增:
typedef struct Contact {
int age;
BSTR name;
BSTR mobile;
BSTR address;
}Contact_t;
typedef Contact_t* PContact_t;
int GetContact([out] PContact_t contact);V6 实现了由 Client 向 Server 获取 contact 结构体(整型和字符串),IDL 文件新增:
typedef Contact_t** PPContact_t;
int GetContactList([out] int* pNum, [out, size_is(, *pNum)] PPContact_t *contact);V7 添加了 Rpc 结构体(BSTR)和 vector 结构体(wstring)的转换方法,IDL 文件修改:
typedef struct RpcContact {
int age;
BSTR name;
BSTR mobile;
BSTR address;
}RpcContact_t;
typedef RpcContact_t* PRPCCONTACT;
typedef RpcContact_t** PPRPCCONTACT;
int GetContact([out] PRPCCONTACT contact);
int GetContactList([out] int* pNum, [out, size_is(, *pNum)] PPRPCCONTACT *contact);V8 添加了回调,实现 Server 往 Client 发送消息,IDL 文件新增:
void EnableReceiveMsg(void);
[callback] int ReceiveMsgCb([ in, string ] const wchar_t *msg);- 创建一个解决方案:
RpcDemo,并保存到RpcDemo目录 - 创建两个项目:
Client和Server,分别保存到RpcDemo/Client和RpcDemo/Server - 创建目录
RpcDemo/Rpc - 在
Server项目下添加筛选器Rpc,并在Rpc下添加demo.idl - 修改 IDL 文件
属性(文件右键):输出目录:$(SolutionDir)Rpc附加包含目录:$(SolutionDir)Rpc命令行:/ms_ext /prefix client "client_" server "server_" /app_config
- 编译 IDL 文件(右键)
- 给
server添加文件:Rpc下添加:rpc_memory.cppdemo_s.c
源文件下添加:server.c
头文件下添加:demo_h.h
- 给
client添加文件:Rpc(参考 4 新增筛选器)下添加:rpc_memory.cppdemo_c.c
源文件下添加:client.c
头文件下添加:demo_h.h
- 添加
附加包含目录server,属性,C/C++,常规,附加包含目录:$(SolutionDir)Rpcclient,属性,C/C++,常规,附加包含目录:$(SolutionDir)Rpc
- 配置依赖关系
解决方案-->属性-->通用属性-->项目依赖项:Client依赖于Server