C++定义函数指针,回调C#

news/2024/7/5 5:25:17/文章来源:https://www.cnblogs.com/ZM191018/p/18280207

C++定义函数指针。

typedef int (__stdcall * delegate_func)(int a, int b);

暴露接口:int __stdcall CPPcallCSharp(delegate_func func);

方法实现:int __stdcall CPPcallCSharp(delegate_func func) { return func(1,2); }

头文件calculator.h

#ifndef LIB_CALCULATOR_H
#define LIB_CALCULATOR_Htypedef int(__stdcall *delegate_func)(int a, int b);int __stdcall CPPcallCSharp(delegate_func func);#endif

源文件calculator.h

// calculator.cpp : Defines the exported functions for the DLL application.
//

#include "stdafx.h"
#include "calculator.h"int __stdcall CPPcallCSharp(delegate_func func) 
{return func(1, 2);
}

C#定义委托。

public delegate int delegate_func(int a, int b);

添加方法:public int callBackFunc(int a, int b) { Return a+b; }

C#中实现C++接口:

[DllImport("CppLib.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall)]

public static extern int CPPcallCSharp(delegate_func func);

C#中调用C++接口,实现回调

public event delegate_func callBack_event =null; callBack_event += new delegate_func(callBackFunc); CPPcallCSharp(callBack_event); 

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Windows.Forms;namespace csharpCallCpp
{public partial class Form1 : Form{public delegate int delegate_func(int a,int b);//导入C++接口[DllImport("calculator.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall)]public static extern int CPPcallCSharp(delegate_func func);public Form1(){InitializeComponent();}public  event delegate_func callBack_event =null;private void button1_Click(object sender, EventArgs e){callBack_event += new delegate_func(callBackFunc);//指定回调方法callBackFuncint iret=CPPcallCSharp(callBack_event);//执行该代码时,方法callbackFunc被执行,且返回(1+2)MessageBox.Show("function return:" + iret);}public  int callBackFunc(int a, int b){return a+b;}}
}

实现效果

 

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

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

相关文章

《DNK210使用指南 -CanMV版 V1.0》第七章 基于CanMV的MicroPython语法开发环境搭建

第七章 基于CanMV的MicroPython语法开发环境搭建章节摘自【正点原子】DNK210使用指南 - CanMV版 V1.03)购买链接:https://detail.tmall.com/item.htm?&id=782801398750 4)全套实验源码+手册+视频下载地址:http://www.openedv.com/docs/boards/k210/ATK-DNK210.html 5)…

金蝶云星空字段之间连续触发值更新

场景说明字段A配置了字段B的计算公式,字段B配置了自动C的计算公式,修改A的时候,触发了B的重算,但是C触发不到。 具体需求:配置值更新事件:料本,料本系数, PCBA加工费,整机装配费,税率%【字段A】公式:供应链含税报价 = ( 料本 * 料本系数 + PCBA加工费 + 整…

PaddleNLP UIE 实体关系抽取

目录环境依赖配置SSH克隆代码训练定制代码结构数据标注准备语料库数据标注导出数据数据转换doccanoLabel Studio模型微调问题处理找不到 paddlenlp.trainer找不到GPUprotobuf==3.20.2CUDA/cuDNN/paddle PaddleNLP UIE 实体关系抽取 PaddlePaddle用户可领取免费Tesla V100在线算…

Python对历年高考分数线数据用聚类、决策树可视化分析一批、二批高校专业、位次、计划人数数据|附代码数据

全文链接:https://tecdat.cn/?p=36626 原文出处:拓端数据部落公众号 随着高等教育的普及与竞争的日益激烈,高考作为通往高等教育的重要门槛,其分数线的波动、高校及专业的选择成为了社会广泛关注的焦点。考生和家长在面临众多高校和专业的选择时,往往需要综合考虑多种因素…

阿里228x82y还原之递归数组解密

声明 本文章中所有内容仅供学习交流,抓包内容、敏感网址、数据接口均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关,若有侵权,请联系我立即删除! 目标网站 某里228 分析逆向流程 228递归函数str解密 原理就是用数组push最后填充下,然…

ffmpeg在Windows上的安装

首先进入官网Download FFmpeg 选择windows版本下载想要的版本 Gyan.dev的版本可能会更符合Windows标准,而BtbN的版本可能会更加开放和跨平台往下拉选择想要的版本进行下载 我下载的是第一个下载好之后解压文件复制bin目录的路径 接着按照下面的顺序进行环境配置,结束后一路确…

leaflet如何把低层级瓦片在高层级显示

https://leafletjs.cn/reference.html#gridlayer使用了maxNativeZoom属性 示例 let map = L.map("map", {attributionControl: false,maxZoom: 18, }).setView([62, -82], 6);let layer_keepLevel_16 = L.tileLayer("url", {minZoom: 1,maxZoom: 18,maxNat…

Java JVM——11. 执行引擎

1.概述执行引擎属于JVM的下层,里面包括:解释器、即时编译器、垃圾回收器。执行引擎是Java虚拟机核心的组成部分之一。“虚拟机”是一个相对于“物理机”的概念,这两种机器都有代码执行能力,其区别是物理机的执行引擎是直接建立在处理器、缓存、指令集和操作系统层面上的,而…

vue3+vite打包优化

1、清除console和debugger 安装 terser插件npm install terser -Dbuild里添加terserOptions配置// 打包环境移除console.log,debugger terserOptions: { compress: { drop_console: true, drop_debugger: true } }, 二、gzip静态资源压缩 第一步:客户端打包开启首先下载 vit…

Java JVM 执行引擎深入解析

1.执行引擎概述执行引擎属于JVM的下层,里面包括:解释器、即时编译器、垃圾回收器。执行引擎是Java虚拟机核心的组成部分之一。“虚拟机”是一个相对于“物理机”的概念,这两种机器都有代码执行能力,其区别是物理机的执行引擎是直接建立在处理器、缓存、指令集和操作系统层面…

Vuex

Vuex 什么是Vuex? 概念:专门在Vue中实现集中式状态(数据)管理的一个Vue插件,对应用中多个组件的共享状态进行集中式管理(读/写),也是组件间通信的方式,且适用于任意组件间通信 之前想要传递数据,可以使用全局事件总线/消息订阅去实现,但是如果有很多组件都想要去读和写…

27-String类

String字符串是常量,创建之后不可改变 字符串字面值存储在字符串池中,可以共享 String s = "hello"; 产生一个对象,字符串池中存储 String s = new String("hello");//产生两个对象,堆、池各存储一个String name = "hello";//"hello…

01字典树和可持久化01字典树

01字典树 01字典树是一种只有0和1两种边的字典树。可以解决查询第 \(k\) 小,查询 \(x\) 是第几小等问题。 查询第 \(k\) 小 可以把输入的数转成等长二进制,然后插入01字典树。比如将 \([0,0,1,3,3]\) 插入字典树:这里红色数字表示以该段为前缀的数的个数,黑色表示对应的数。…

c# , net 创建树形结构,创建树形节点

/// <summary> /// 生成树形结构 /// </summary> public void GetTreeNode() {//SqlHelper.GetSqlDataReader是封装的查询数据库语句,可根据自己需求封装//假设获取所有一级节点List<Products> products = SqlHelper.GetSqlDataReader(sql);for (int i = 0; …

abc360 E 题解

E 对于位置2~n,它们的概率是相等的。 n*n个(x,y)对。其中x可以等于y。对于x/y,y的逆元rev(y)为mul(y,mod-2)。 加、减、乘、除都可以做。比如48/9和16/3的结果是一样的,48*rev(9)%mod = 16*rev(3)%mod。比如3*rev(2)%mod = (rev(2)+rev(2)+rev(2))%mod.对于每次操作,有多少…

数业智能荣登「全球应用算法模型大赛50强」

近日,由上海市经济和信息化委员会、上海市普陀区人民政府,上海市人工智能行业协会主办,上海人工智能研究院等单位联合承办的《BPAA第四届全球应用算法模型典范大赛》经过一个多月的角逐,最终公布《BPAA第四届全球应用算法模型典范大赛TOP50榜单》。数业智能心大陆凭借独立自…

快速调用 GLM-4-9B-Chat 语言模型

一、确认本机显卡配置二、下载大模型 国内可以从魔搭社区下载, 下载地址:https://modelscope.cn/models/ZhipuAI/glm-4-9b-chat/files 三、运行官方代码import torch from transformers import AutoModelForCausalLM, AutoTokenizerdevice = "cuda"tokenizer = A…

戴尔服务器SQL server数据恢复

服务器数据恢复环境: 一台Dell服务器,共有10块硬盘,配置了raid5磁盘阵列,操作系统:linux,里面存有SQL server数据库。服务器数据恢复故障检测分析: 服务器在正常运行过程中,对服务器进行重装系统操作,操作成功后发现服务器的磁盘分区与原来不同,其中一个分区丢失,其…

网络安全:Nginx安全问题使1400多万台服务器容易受到ddos攻击

据外媒报道,近日 nginx 被爆出存在安全问题,有可能会致使 1400 多万台服务器易遭受 DoS 攻击。 而导致安全问题的漏洞存在于 HTTP/2 和 MP4 模块中。 新版本的Nginx Web服务器已于11月6日发布,用于修复影响1.15.6,1.14.1之前版本的多个安全问题, 该漏洞允许潜在的攻击者触发…