C# 如何调用 C++ DLL中的函数接口和回调函数

1、c#中大部分基本数据类型都和c++的基本数据类型相同,因此基本数据类型的转换比较简单,需要注意的就是字节大小。 2、c++数组和c#的数组转换需要注意的就是需要注意,需要增加声明如[marshalas(unmanagedtype.byvalarray, sizeconst = 10)]才能定义一个c++中的数组元素为10个的数组。 3、 c++的回调函数接口需要采用c#中的委托函数方法,c++的中回调函数设置中,一般使用的是地址值,因此需要c#中显示采用托管函数。 4、c++的指针数组,可用c#中的intptr ;如果只是地址指针,则c#中引用类型即可。类型前加ref

举例说明: using System; using System.Collections.Generic; using System.Text; using System.Runtime.InteropServices;

namespace IPNBSVTD_CSharp { public delegate void StatusCallBack(IntPtr dwInstance, IntPtr wParam, IntPtr lParam); public delegate void VoiceCallBack(IntPtr dwInstance, byte ucDeviceIndex, IntPtr pInDataBuf, ref int pInDataLen, IntPtr pOutDataBuf, int nOutDataLen);

public enum VT_MESSAGE{    VT_MESSAGE_SET_DEVICE_INFO,    VT_MESSAGE_UPDATE_DEVICE_INFO,    VT_MESSAGE_UPDATE_MIXER_IN_CTRL,    VT_MESSAGE_UPDATE_MIXER_OUT_CTRL,    VT_MESSAGE_MISSED_CALLS,                // 未接来电};public enum VT_TASK_TYPE //终端状态{    VT_TASK_TYPE_NULL,                //空闲(无任务)    VT_TASK_TYPE_TO_MONITOR,        //发起监听    VT_TASK_TYPE_BY_MONITOR,        //被监听    VT_TASK_TYPE_TO_BROADCAST,        //发起采播    VT_TASK_TYPE_BY_BROADCAST,        //接收采播    VT_TASK_TYPE_TO_TALK,            //发起对讲    VT_TASK_TYPE_BY_TALK,            //接收对讲    VT_TASK_TYPE_MULTITALK,            //多方通话    VT_TASK_TYPE_OFFLINETALK,       //离线对讲};public enum VT_TASK_STATE //终端任务状态        {    VT_TASK_STATE_NULL,                // 无任务    VT_TASK_STATE_STOP,                // 监听停止,对讲停止,广播停止    VT_TASK_STATE_CONNECTING,        // 监听:连接中    VT_TASK_STATE_CALLING,            // 对讲:呼叫中    VT_TASK_STATE_BEGIN_BC_PROMPT,    // 广播:开始提示音    VT_TASK_STATE_END_BC_PROMPT,    // 广播:结束提示音    VT_TASK_STATE_ONGOING,            // 监听中,对讲中,广播中};public enum VT_TARGET_STATE // 目标状态{    VT_TARGET_STATE_NULL = 0,            // 未知    VT_TARGET_STATE_OFFLINE,            // 目标脱机    VT_TARGET_STATE_STOP,                // 目标停止    VT_TARGET_STATE_REJECT,                // 目标拒绝    VT_TARGET_STATE_BUSY,                // 目标呼叫忙};[StructLayout(LayoutKind.Sequential)]public struct VT_TASK_TARGET{    public int nCount;                                // 监听,对讲,广播选择的目标数量    public int nEditPos;                            // 当前正在编辑的位置    public VT_TASK_TYPE xeTaskType;                            // 任务类型    public VT_TASK_STATE xeTaskState;                        // 任务组的任务状态    public VT_TARGET_STATE xeTargetState;                        // 对讲目标状态    public bool bIsBegin;                            // 任务是否已开始(呼叫...)    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]    public VT_TASK_STATE[] pxeTerState;    // 各终端的任务状态  VT_DEVICE_MAX_COUNT 6    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 128)]    public ushort[] pwID;        // 终端ID(0:1号终端...)或分区号(1:分区1...) VT_BROADCAST_MAX_COUNT            128    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 128)]    public int[] piSerIdx;    // 各终端对应的服务器编号    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]    public byte[] pucPanelNo;    // NAS-8521,呼叫到面板,终端对应的面板序号    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 256)]    public char[] strFileName; // 文件广播时,当前广播的文件名    public uint offlineTargetIP; //离线目标IP    public ushort offlineTargetPort;  //离线目标端口};[StructLayout(LayoutKind.Sequential)]public struct tagSERVER{    public uint ipServer;                // 服务器IP (字节反序)    public ushort wServerPort;            // 服务器接收端口 (字节反序)    public bool bFixPort;                // 是否固定接收端口    public ushort wHostPort;            // 本机接收端口 (字节反序)    public bool bOnline;                // 是否联机    public bool bIsPCM;                    // 是否是PCM/ADPCM压缩    public bool bIs8K;                    // 是否是8K/22K采样    public bool bIsMultiCast;            // 是否是组播/单播    public bool bRecord;                // 是否录音    public uint ipRecord;                // 录音IP    public ushort wRecordPort;            // 录音端口};[StructLayout(LayoutKind.Sequential)]public struct VT_DEVICE_INFO{    public ushort wDeviceId;            // 设备编号(从0开始,显示时要加1)    public uint ipHost;                    // 主机IP (字节反序)    public bool bIsRegister;            // 是否注册    public ushort dwVol;                // 当前输出音量    public int iServerCount;            // 服务器的数量    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)]    public tagSERVER[] pxsServer;       // 服务器    public int nTaskCount;                // 任务数量    public int nCurTask;                // 当前任务(对应于xsTaskTarget的下标)    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 1)]    public VT_TASK_TARGET[] pxsTaskArray;        // 任务目标};/// /// 跨平台调用方法/// public class NativeMethod{    ///     /// 路径最大大小    ///     public const int MAX_PATH = 260;    [DllImport("IPNBSVTD.dll")]    public static extern void IPNBSVTD_DeleteDevice();    [DllImport("IPNBSVTD.dll")]    public static extern byte IPNBSVTD_CreateDevice(byte ucCount);    [DllImport("IPNBSVTD.dll")]    public static extern bool IPNBSVTD_DeviceMute(ref bool pbMute, bool bIsAudioOut, bool bIsSet);    [DllImport("IPNBSVTD.dll")]    public static extern bool IPNBSVTD_DeviceVolume(ref int pdwVolume, bool bIsAudioOut, bool bIsSet);    [DllImport("IPNBSVTD.dll")]    public static extern void IPNBSVTD_SetINIFilePath(byte ucDeviceIndex, string pINIFilePath);    [DllImport("IPNBSVTD.dll")]    public static extern bool IPNBSVTD_OpenServer(byte ucDeviceIndex, IntPtr hParentWnd, uint nMsg);    //[DllImport("IPNBSVTD.dll")]    //public static extern bool IPNBSVTD_SetBCFromFile(byte ucDeviceIndex, bool bBCFromFile, bool bLoop,    //    [MarshalAs(UnmanagedType.LPArray)]string[] pStrFile, short sFileCount);    [DllImport("IPNBSVTD.dll")]    public static extern bool IPNBSVTD_SetBCFromFileEx(byte ucDeviceIndex, bool bBCFromFile, bool bLoop, string strFile, bool bAdd);    public static void SetBCFromFile(byte ucDeviceIndex, bool bBCFromFile, bool bLoop, List files, short sFileCount)    {        for (int i = 0; i 

}

登录后复制

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2445692.html

(0)
上一篇 2025年3月3日 16:11:53
下一篇 2025年2月27日 23:38:04

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • c++中向任意目录下写文件

    今天遇到了在c盘的子目录下写文件出错的事情,最中自己实验后解决。小小记录一下。 代码如下: #include#include#include main(){ int data[35]; int n=35,temp; for(int i=0;…

    2025年3月3日
    200
  • C#实现一个最简单的HTTP服务器

     简介   本文用c#实现了一个最简单的http服务器类,你可以将它嵌入到自己的项目中,或者也可以阅读代码来学习关于http协议的知识。  背景   高性能的WEB应用一般都架设在强大的WEB服务器上,例如IIS, Apache, 和Tom…

    编程技术 2025年3月3日
    200
  • C# 程序员最常犯的 10 个错误

     关于C#   c#是达成微软公共语言运行库(clr)的少数语言中的一种。达成clr的语言可以受益于其带来的特性,如跨语言集成、异常处理、安全性增强、部件组合的简易模型以及调试和分析服务。作为现代的clr语言,c#是应用最为广泛的,其应用场…

    编程技术 2025年3月3日
    200
  • C#的未来计划

     在ndc london上,mads torgersen提出了对未来c#语言的的计划。需要注意的是,这些只是计划,不会保证在哪个版本发布。damien guard对这些建议进行了总结和简要的分析,我们在此为您挑选了其中的一些内容。  只读属…

    编程技术 2025年3月3日
    200
  • C# 的三种序列化方法

      序列化是将一个对象转换成字节流以达到将其长期保存在内存、数据库或文件中的处理过程。它的主要目的是保存对象的状态以便以后需要的时候使用。与其相反的过程叫做反序列化。   序列化一个对象   为了序列化一个对象,我们需要一个被序列化的对象,…

    编程技术 2025年3月3日
    200
  • 理解模型,视图和控制器(C#,asp.net)

     这篇文章向你提供asp.net mvc 模型,视图和控制的高度概览。换句话说,解释一下asp.net mvc中的 ‘m’, ‘v’, 和 ‘c’。   看完这篇文章以后,你应该就能理解ASP.NET MVC的不同部分是如何共同工作的。而且…

    2025年3月3日 编程技术
    200
  • 能让你成为更优秀程序员的10个C语言资源

    一些人觉得编程无聊,一些人觉得它很好玩。但每个程序员都必须紧跟编程语言的潮流。大多数程序员都是从c开始学习编程的,因为c是用来写操作系统、应用程序最常用的语言。 C编程笔记 这些是华盛顿实验学院C编程入门课的部分笔记。它们是以《C程序设计语…

    编程技术 2025年3月3日
    200
  • C语言快速学习与入门指南

    有人认为,现在是java和.net的时代,有谁还需要c以及汇编呢?孰不知,java和.net是建立在软件之上的,是为了垄断市场而建立起来的体系,犹如挖好一个金壁辉煌的坑,请你往下跳,还自以为站在巨人的肩膀上,事实上成了坑底之蛙。要成为一个真…

    编程技术 2025年3月3日
    200
  • C#程序员经常用到的10个实用代码片段

     1 读取操作系统和CLR的版本 OperatingSystem os = System.Environment.OSVersion;Console.WriteLine(“Platform: {0}”, os.Platform);Conso…

    编程技术 2025年3月3日
    200
  • C++中内存泄漏的检测

    首先我们需要知道程序有没有内存泄露,然后定位到底是哪行代码出现内存泄露了,这样才能将其修复。 最简单的方法当然是借助于专业的检测工具,比较有名如BoundsCheck,功能非常强大,相信做C++开发的人都离不开它。此外就是不首先我们需要知道…

    编程技术 2025年3月3日
    200

发表回复

登录后才能评论