Skip to content

lich0821/WindowsRpcDemo

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

26 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Yet Another Demo for Windows RPC

开发环境:

  • 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.exeClient.exe

版本说明

V1

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

V2 实现了由 Client 向 Server 发送字符串并获取字符串,IDL 文件新增:

    int GetString([in, string] const wchar_t* inStr, [out, string] wchar_t outStr[128]);

V3

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

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

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

V6 实现了由 Client 向 Server 获取 contact 结构体(整型和字符串),IDL 文件新增:

    typedef Contact_t** PPContact_t;

    int GetContactList([out] int* pNum, [out, size_is(, *pNum)] PPContact_t *contact);

V7

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

V8 添加了回调,实现 Server 往 Client 发送消息,IDL 文件新增:

    void EnableReceiveMsg(void);
    [callback] int ReceiveMsgCb([ in, string ] const wchar_t *msg);

从零创建工程

  1. 创建一个解决方案:RpcDemo,并保存到 RpcDemo 目录
  2. 创建两个项目:ClientServer,分别保存到 RpcDemo/ClientRpcDemo/Server
  3. 创建目录 RpcDemo/Rpc
  4. Server 项目下添加筛选器 Rpc,并在 Rpc 下添加 demo.idl
  5. 修改 IDL 文件 属性(文件右键):
    • 输出目录$(SolutionDir)Rpc
    • 附加包含目录$(SolutionDir)Rpc
    • 命令行/ms_ext /prefix client "client_" server "server_" /app_config
  6. 编译 IDL 文件(右键)
  7. server 添加文件:
    • Rpc 下添加:
      • rpc_memory.cpp
      • demo_s.c
    • 源文件 下添加:
      • server.c
    • 头文件 下添加:
      • demo_h.h
  8. client 添加文件:
    • Rpc(参考 4 新增筛选器)下添加:
      • rpc_memory.cpp
      • demo_c.c
    • 源文件 下添加:
      • client.c
    • 头文件 下添加:
      • demo_h.h
  9. 添加 附加包含目录
    • server属性C/C++常规附加包含目录$(SolutionDir)Rpc
    • client属性C/C++常规附加包含目录$(SolutionDir)Rpc
  10. 配置依赖关系 解决方案 --> 属性 --> 通用属性 --> 项目依赖项Client 依赖于 Server

About

Windows RPC Demo.

Resources

License

Stars

1 star

Watchers

1 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors