Windows C++ 使用WinAPI实现RPC

demo下载地址:https://download.csdn.net/download/2403_83063732/88958730

1、创建IDL文件以及acf文件(创建helloworld.idl helloworld.acf)

其中IDL文件:

import "oaidl.idl";
import "ocidl.idl";
[
    uuid("4556509F-618A-46CF-AB3D-ED736ED66477"),   // 唯一的UUID,主要是用来通讯的时候使用
    version(1.0)
]

interface HelloWorld
{
    // 官方文档推荐的自定义字符串写法(带长度和大小)
    typedef struct _MYSTRING
    { 
        unsigned short size; 
        unsigned short length; 
        [ptr,size_is(size), length_is(length)] char string[*]; 
    } MYSTRING;
    typedef [ptr] MYSTRING** PPMYSTRING;
    typedef [ptr] MYSTRING* PMYSTRING;

    // 我们定义的方法,只列举这几个应该够我们用了
    void Hello([in, string]const char * psz);//只输入,不带返回值
    int Add([in]int a1,[in]int a2);//带返回值
    int GetTestString([out]PMYSTRING *pName);//可以获取对端的数据,比如状态或者其他
}
 

ACF文件如下内容 

[
    implicit_handle (handle_t HelloWorld_IfHandle)

interface HelloWorld
{
}

2、调用midl指令,生成.c/.h文件

midl helloworld.idl /acf helloworld.acf /out ./

如下生成helloworld.h ,helloworld_c.h,helloworld_s.h

3、创建客户端工程以及服务端工程

客户端工程包含helloworld.h ,helloworld_c.h

服务端工程包含helloworld.h ,helloworld_s.h

如下图

4、服务端代码

 midl_user_allocate/midl_user_free函数必须要,不然编译会报错

#include "../TestRpcC/helloworld.h"
#pragma comment(lib,"Rpcrt4.lib")

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);
}

void Hello( const unsigned char * psz)
{
    printf("Hello:%s\n", psz);
}

int Add(
    /* [in] */ int a1,
    /* [in] */ int a2)
{
    return a1 + a2;
}

int GetTestString(
    /* [out] */ PMYSTRING *pName)
{
    int nLen = strlen("test");
    *pName = (PMYSTRING)MIDL_user_allocate(sizeof(PMYSTRING) + nLen);
    (*pName)->length = nLen;
    (*pName)->size = sizeof(PMYSTRING) + nLen;
    strncpy((char*)(*pName)->string, "test", nLen);
    return nLen;

}

int main()
{
    // 用Named Pipe 作为RPC 的通道,这样EndPoint 参数就是Named Pipe 的名字
     // 按照Named Pipe 的命名规范,/pipe/pipename,其中pipename 可以是除了/
     // 之外的任意字符,那么这里用一个GUID 串来命名,可以保证不会重复
    RPC_STATUS st = RpcServerUseProtseqEpA((unsigned char *)"ncacn_np", 20, (unsigned char *)"\\pipe\\{8dd50205-3108-498f-96e8-dbc4ec074cf9}", NULL);
    if (st != RPC_S_OK)
    {
        return -1;
    }

    // 注册接口,HelloWorld_v1_0_s_ifspec 是在MIDL 生成的helloworld.h 中定义的
    st = RpcServerRegisterIf(HelloWorld_v1_0_s_ifspec, NULL, NULL);
    if (st != RPC_S_OK)
    {
        return -1;
    }

    // 开始监听,本函数将一直阻塞
    st = RpcServerListen(1, 20, FALSE);
    if (st != RPC_S_OK)
    {
        return -1;
    }
    return 0;
}

5、客户端代码 

midl_user_allocate/midl_user_free函数必须要,不然编译会报错

#include "helloworld.h"
#pragma comment(lib,"Rpcrt4.lib")
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);
}

int main()
{
    unsigned char *pszUuid = NULL;
    unsigned char pszProtocolSequence[] = "ncacn_np";
    unsigned char *pszNetworkAddress = NULL;
    unsigned char pszEndpoint[] = "\\pipe\\{8dd50205-3108-498f-96e8-dbc4ec074cf9}";
    unsigned char *pszOptions = NULL;
    unsigned char *pszStringBinding = NULL;
    RPC_STATUS rpcStatus = RpcStringBindingComposeA(pszUuid,
                                                    pszProtocolSequence,
                                                    pszNetworkAddress,
                                                    pszEndpoint,
                                                    pszOptions,&pszStringBinding);
    if (rpcStatus)
        exit(rpcStatus);

    rpcStatus = RpcBindingFromStringBindingA(pszStringBinding,&HelloWorld_IfHandle);
    if (rpcStatus)
        exit(rpcStatus);

    RpcTryExcept
    {
        Hello((unsigned char *)"nihaosadjklasjldkjaskldjkasdasdasdasdasdasdasdasd");
        int ret = Add(16, 40);
        printf("ret = %d \n", ret);
        PMYSTRING baseData = NULL;
        ret = GetTestString(&baseData);
        if (ret > 0)
        {
            char *pBuf = new char[ret + 1];
            memset(pBuf,0,ret + 1);
            memcpy(pBuf, baseData->string,ret);
            printf("ret = {%d,%s} \n", ret, pBuf);
            delete[]pBuf;
        }
        
    }
    RpcExcept(1)
    {
    unsigned long ulCode = RpcExceptionCode();
    printf("抛出异常0x%lx = %ld。\n", ulCode, ulCode);
    }
      RpcEndExcept
    
    rpcStatus = RpcStringFreeA(&pszStringBinding);
    if (rpcStatus)
            exit(rpcStatus);
    rpcStatus = RpcBindingFree(&HelloWorld_IfHandle);
    if (rpcStatus)
        exit(rpcStatus);
    return 0;
}

6、运行结果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/275585.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL的事务隔离是如何实现的?

目录 从一个例子说起 快照读和当前读 事务的启动时机和读视图生成的时刻 MVCC 隐藏字段 Undo Log回滚日志 Read View - 读视图 可重复读(RC)隔离级别下的MVCC 读提交(RR)隔离级别下的MCC 关于MVCC的一些疑问 1.为什么需要 MVCC ?如果没有 MVCC 会怎样&am…

Python学习笔记-Flask实现简单的抽奖程序(增加图片显示)

1.创建static文件夹,存放图片文件 2.hero列表数据更改为要抽奖的图片名 3.html中可以编写python语句,遍历hero列表内容渲染到表格中 4.在点击随机抽取后,可以获得名称,然后使用img标签,将获取的名称拼接到路径中 3.初始页面,访问127.0.0.1:5000/index 4.点击随机抽取后 5.py…

ResNeXt学习笔记

一、更新了block 二、将block中的卷积层分组 注意:对于block层数小于3的,没有太大作用

AIGC实战——GPT(Generative Pre-trained Transformer)

AIGC实战——GPT 0. 前言1. GPT 简介2. 葡萄酒评论数据集3. 注意力机制3.1 查询、键和值3.2 多头注意力3.3 因果掩码 4. Transformer4.1 Transformer 块4.2 位置编码 5. 训练GPT6. GPT 分析6.1 生成文本6.2 注意力分数 小结系列链接 0. 前言 注意力机制能够用于构建先进的文本…

System Verilog的接口、程序块与断言解析

接口、程序块与断言 1 接口 1.1 使用接口简化连接 // 接口 interface arb_if(input bit clk);logic [1:0] grant,request;logic rst; endinterface// 使用了简单接口的仲裁器 module arb (arb_if arbif);...always(posedge arbif.clk or posedge arbif.rst)beginif(arbif.rs…

opencv dnn模块 示例(25) 目标检测 object_detection 之 yolov9

文章目录 1、YOLOv9 介绍2、测试2.1、官方Python测试2.1.1、正确的脚本2.2、Opencv dnn测试2.2.1、导出onnx模型2.2.2、c测试代码 2.3、测试统计 3、自定义数据及训练3.1、准备工作3.2、训练3.3、模型重参数化 1、YOLOv9 介绍 YOLOv9 是 YOLOv7 研究团队推出的最新目标检测网络…

软件测试中的AI-为什么它在软件自动化测试中很重要?

通俗地说,人工智能(AI)是计算机科学的一个领域,它专注于使机器“智能化”。所谓智能,就是使系统能够像人类一样学习和做出决策。因此,人工智能机器将能够学习如何在特定情况下做出反应,然后根据…

【AIGC】重磅消息,GPT-4.5 Turbo将在6月发布?

2024 年 AI 辅助研发趋势 文章目录 强烈推荐GPT-4.5 Turbo竞争对手Anthropic的Claude 3谷歌的Gemini 1.5 Pro 总结强烈推荐专栏集锦写在最后 强烈推荐 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击…

Cplex之新建一个项目并求解

cplex下载:Cplex安装教程与使用介绍-CSDN博客 链接:https://pan.baidu.com/s/1jD9Xved2aWPHtRd-_PLI5Q 提取码:n4og 补充b站上一个教程:快速学懂Cplex软件及其编程方法_哔哩哔哩_bilibili 一、建立并求解一个模型 step1 : 新…

【目标检测经典算法】R-CNN、Fast R-CNN和Faster R-CNN详解系列一:R-CNN图文详解

学习视频:Faster-RCNN理论合集 概念辨析 在目标检测中,proposals和anchors都是用于生成候选区域的概念,但它们在实现上有些许不同。 Anchors(锚框): 锚框是在图像中预定义的一组框,它们通常以…

Python:函数的形参与实参

注意:本文引用自专业人工智能社区Venus AI 更多AI知识请参考原站 ([www.aideeplearning.cn]) 函数基本概念 在Python中,函数是一种将代码封装以进行重复使用的机制。它们允许你定义一段代码,以便在程序的多个位置调…

微信小程序开发系列(二十六)·小程序运行机制(启动、前后台状态、挂起、销毁)和小程序更新机制

目录 1. 小程序运行机制 1.1 启动 1.2 前台和后台状态 1.3 挂起 1.4 销毁 2. 小程序更新机制 1. 小程序运行机制 1.1 启动 小程序启动可以分为两种情况,一种是冷启动,一种是热启动。 冷启动:如果用户首次打开,或小…

OPPO后端二面,凉了!

这篇文章的问题来源于一个读者之前分享的 OPPO 后端凉经,我对比较典型的一些问题进行了分类并给出了详细的参考答案。希望能对正在参加面试的朋友们能够有点帮助! Java String 为什么是不可变的? public final class String implements java.io.Seri…

阿里云服务器安全狗免费使用多引擎智能查杀引擎

云服务器具有按量付费、降低综合成本等诸多优势,受到很多企业的欢迎。 因此,目前使用的云服务器越来越多。 阿里云是目前云服务器中最具影响力的品牌,因此选择阿里云服务器的用户数量也是最多的。 那么阿里云服务器需要安装杀毒软件吗&#x…

Python学习:数据类型转换

数据类型转换 对数据内置的类型进行转换,数据类型的转换,一般情况下你只需要将数据类型作为函数名即可。 Python 数据类型转换可以分为两种: 隐式类型转换 - 自动完成显式类型转换 - 需要使用类型函数来转换 隐式类型转换 Python 会自动…

微信小程序一次性订阅requestSubscribeMessage授权和操作详解

一次性订阅:用户订阅一次发一次通知 一、授权 — requestSubscribeMessage Taro.requestSubscribeMessage({tmplIds: [], // 需要订阅的消息模板的id的集合success (res) {console.log("同意授权", res)},fail(res) {console.log(拒绝授权, res)}})点击或…

2001-2022年上市公司数字化转型程度指数测算数据(含原始数据+测算代码+计算结果)(无形资产衡量)

2001-2022年上市公司数字化转型程度指数测算数据(含原始数据测算代码计算结果) 1、时间:2001-2022年 2、指标:证券代码、证券简称、统计截止日期、是否发生ST或*ST或PT、、是否发生暂停上市、行业代码、行业名称、stkcd、year、…

mediapipe 实现姿态分析——举手检测

目录 人体姿态检测 效果展示 举手检测 行业应用 代码实现 代码分析 效果展示 代码修改,一只手举起即可 总结 啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦^_^啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦♪(^∇^*)啦啦啦…

【数据结构】二叉树---AVL树的实现

目录 一. 什么是AVL树 二. AVL树的结点结构定义 三. AVL树的动态平衡法 1. 左单旋转 --- RL(RotateLeft) 型调整操作 2. 右单旋转 --- RR(RotateRight) 型调整操作 3. 先左后右双旋转 --- RLR (RotateLeftRight) 型调整操作 4. 先右后左双旋转 --- RRL (RotateRightL…

Day32:安全开发-JavaEE应用Servlet路由技术JDBCMybatis数据库生命周期

目录 JavaEE-HTTP-Servlet&路由&周期 JavaEE-数据库-JDBC&Mybatis&库 思维导图 Java知识点: 功能:数据库操作,文件操作,序列化数据,身份验证,框架开发,第三方库使用等. 框架…