찾다
백엔드 개발C#.Net 튜토리얼C#에서 C++ DLL의 함수 인터페이스 및 콜백 함수를 호출하는 방법

1. C#의 기본 데이터 유형은 대부분 C++의 기본 데이터 유형과 동일하므로 기본 데이터 유형의 변환이 상대적으로 간단합니다. 주의해야 할 것은 바이트 크기입니다. 2. C++ 배열과 C# 배열을 변환할 때 주의할 점은 C++에서 10개의 배열 요소로 배열을 정의하려면 [MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)]와 같은 문을 추가해야 한다는 것입니다. 3. C++의 콜백 함수 인터페이스는 C#의 대리자 함수 메서드를 사용해야 합니다. C++의 콜백 함수 설정에서는 일반적으로 주소 값을 사용하므로 관리되는 함수를 C#으로 표시해야 합니다. 4. C++의 포인터 배열의 경우 C#의 IntPtr을 사용할 수 있습니다. 주소 포인터인 경우 C#의 참조 유형을 사용할 수 있습니다. 예를 들어 다음과 같이 유형 앞에 ref

를 추가합니다. using System.Text; using System.Runtime.InteropServices;

namespace IPNBSVTD_CSharp { Public Delegate void StatusCallBack( IntPtr dwInstance, IntPtr wParam, IntPtr lParam); 공개 위임 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;        // 任务目标};/// <summary>/// 跨平台调用方法/// </summary>public class NativeMethod{    /// <summary>
    /// 路径最大大小
    /// </summary>
    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<string> files, short sFileCount)    {        for (int i = 0; i < files.Count; i++)
            IPNBSVTD_SetBCFromFileEx(ucDeviceIndex, bBCFromFile, bLoop, files[i], (i == 0) ? false : true);
    }

    [DllImport("IPNBSVTD.dll")]    public static extern bool IPNBSVTD_SetBCToTerm(byte ucDeviceIndex);

    [DllImport("IPNBSVTD.dll")]    public static extern bool IPNBSVTD_GetCurTaskTarget(byte ucDeviceIndex, ref VT_TASK_TARGET pTaskTarget, int iTaskPos);

    [DllImport("IPNBSVTD.dll")]    public static extern bool IPNBSVTD_SetCurTaskTarget(byte ucDeviceIndex, ref VT_TASK_TARGET pTaskTarget, int iTaskPos);

    [DllImport("IPNBSVTD.dll")]    public static extern bool IPNBSVTD_TaskBegin(byte ucDeviceIndex, int iTaskPos);

    [DllImport("IPNBSVTD.dll")]    public static extern bool IPNBSVTD_TaskEnd(byte ucDeviceIndex, int iTaskPos);

    [DllImport("IPNBSVTD.dll")]    public static extern bool IPNBSVTD_GetDeviceInfo(byte ucDeviceIndex, ref VT_DEVICE_INFO pDeviceInfo);

    [DllImport("IPNBSVTD.dll")]    public static extern bool IPNBSVTD_GetBCFileCurrent(byte ucDeviceIndex, StringBuilder strFile);

    [DllImport("IPNBSVTD.dll")]    public static extern bool IPNBSVTD_SetStatusCallBack(byte ucDeviceIndex, StatusCallBack dwCallBack, IntPtr dwInstance);

    [DllImport("IPNBSVTD.dll")]    public static extern bool IPNBSVTD_SetVoiceCallBack(byte ucDeviceIndex, VoiceCallBack dwCallBack, IntPtr dwInstance);

    [DllImport("IPNBSVTD.dll")]    public static extern bool IPNBSVTD_SetFileBCNext(byte ucDeviceIndex);

    [DllImport("IPNBSVTD.dll")]    public static extern bool IPNBSVTD_SetFileBCPause(byte ucDeviceIndex, bool bPause);        

    [DllImport("IPNBSVTD.dll")]    public static extern bool IPNBSVTD_SetFileBCPrevious(byte ucDeviceIndex);

    [DllImport("IPNBSVTD.dll")]    public static extern uint IPNBSVTD_GetBCFileCurrentPlayPos(byte ucDeviceIndex, ref uint pBcFileLen);

    [DllImport("IPNBSVTD.dll")]    public static extern bool IPNBSVTD_SetFileBCPlayListPos(byte ucDeviceIndex, byte ucPlayListPos);
}

}

성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
如何使用C#编写时间序列预测算法如何使用C#编写时间序列预测算法Sep 19, 2023 pm 02:33 PM

如何使用C#编写时间序列预测算法时间序列预测是一种通过分析过去的数据来预测未来数据趋势的方法。它在很多领域,如金融、销售和天气预报中有广泛的应用。在本文中,我们将介绍如何使用C#编写时间序列预测算法,并附上具体的代码示例。数据准备在进行时间序列预测之前,首先需要准备好数据。一般来说,时间序列数据应该具有足够的长度,并且是按照时间顺序排列的。你可以从数据库或者

如何使用Redis和C#开发分布式事务功能如何使用Redis和C#开发分布式事务功能Sep 21, 2023 pm 02:55 PM

如何使用Redis和C#开发分布式事务功能引言分布式系统的开发中,事务处理是一项非常重要的功能。事务处理能够保证在分布式系统中的一系列操作要么全部成功,要么全部回滚。Redis是一种高性能的键值存储数据库,而C#是一种广泛应用于开发分布式系统的编程语言。本文将介绍如何使用Redis和C#来实现分布式事务功能,并提供具体代码示例。I.Redis事务Redis

如何实现C#中的人脸识别算法如何实现C#中的人脸识别算法Sep 19, 2023 am 08:57 AM

如何实现C#中的人脸识别算法人脸识别算法是计算机视觉领域中的一个重要研究方向,它可以用于识别和验证人脸,广泛应用于安全监控、人脸支付、人脸解锁等领域。在本文中,我们将介绍如何使用C#来实现人脸识别算法,并提供具体的代码示例。实现人脸识别算法的第一步是获取图像数据。在C#中,我们可以使用EmguCV库(OpenCV的C#封装)来处理图像。首先,我们需要在项目

C#开发中如何处理跨域请求和安全性问题C#开发中如何处理跨域请求和安全性问题Oct 08, 2023 pm 09:21 PM

C#开发中如何处理跨域请求和安全性问题在现代的网络应用开发中,跨域请求和安全性问题是开发人员经常面临的挑战。为了提供更好的用户体验和功能,应用程序经常需要与其他域或服务器进行交互。然而,浏览器的同源策略导致了这些跨域请求被阻止,因此需要采取一些措施来处理跨域请求。同时,为了保证数据的安全性,开发人员还需要考虑一些安全性问题。本文将探讨C#开发中如何处理跨域请

Redis在C#开发中的应用:如何实现高效的缓存更新Redis在C#开发中的应用:如何实现高效的缓存更新Jul 30, 2023 am 09:46 AM

Redis在C#开发中的应用:如何实现高效的缓存更新引言:在Web开发中,缓存是提高系统性能的常用手段之一。而Redis作为一款高性能的Key-Value存储系统,能够提供快速的缓存操作,为我们的应用带来了不少便利。本文将介绍如何在C#开发中使用Redis,实现高效的缓存更新。Redis的安装与配置在开始之前,我们需要先安装Redis并进行相应的配置。你可以

如何使用C#编写动态规划算法如何使用C#编写动态规划算法Sep 20, 2023 pm 04:03 PM

如何使用C#编写动态规划算法摘要:动态规划是求解最优化问题的一种常用算法,适用于多种场景。本文将介绍如何使用C#编写动态规划算法,并提供具体的代码示例。一、什么是动态规划算法动态规划(DynamicProgramming,简称DP)是一种用来求解具有重叠子问题和最优子结构性质的问题的算法思想。动态规划将问题分解成若干个子问题来求解,通过记录每个子问题的解,

如何实现C#中的遗传算法如何实现C#中的遗传算法Sep 19, 2023 pm 01:07 PM

如何在C#中实现遗传算法引言:遗传算法是一种模拟自然选择和基因遗传机制的优化算法,其主要思想是通过模拟生物进化的过程来搜索最优解。在计算机科学领域,遗传算法被广泛应用于优化问题的解决,例如机器学习、参数优化、组合优化等。本文将介绍如何在C#中实现遗传算法,并提供具体的代码示例。一、遗传算法的基本原理遗传算法通过使用编码表示解空间中的候选解,并利用选择、交叉和

如何实现C#中的图像压缩算法如何实现C#中的图像压缩算法Sep 19, 2023 pm 02:12 PM

如何实现C#中的图像压缩算法摘要:图像压缩是图像处理领域中的一个重要研究方向,本文将介绍在C#中实现图像压缩的算法,并给出相应的代码示例。引言:随着数字图像的广泛应用,图像压缩成为了图像处理中的重要环节。压缩能够减小存储空间和传输带宽,并能提高图像处理的效率。在C#语言中,我们可以通过使用各种图像压缩算法来实现对图像的压缩。本文将介绍两种常见的图像压缩算法:

See all articles

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

뜨거운 도구

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

MinGW - Windows용 미니멀리스트 GNU

MinGW - Windows용 미니멀리스트 GNU

이 프로젝트는 osdn.net/projects/mingw로 마이그레이션되는 중입니다. 계속해서 그곳에서 우리를 팔로우할 수 있습니다. MinGW: GCC(GNU Compiler Collection)의 기본 Windows 포트로, 기본 Windows 애플리케이션을 구축하기 위한 무료 배포 가능 가져오기 라이브러리 및 헤더 파일로 C99 기능을 지원하는 MSVC 런타임에 대한 확장이 포함되어 있습니다. 모든 MinGW 소프트웨어는 64비트 Windows 플랫폼에서 실행될 수 있습니다.

Atom Editor Mac 버전 다운로드

Atom Editor Mac 버전 다운로드

가장 인기 있는 오픈 소스 편집기

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

mPDF

mPDF

mPDF는 UTF-8로 인코딩된 HTML에서 PDF 파일을 생성할 수 있는 PHP 라이브러리입니다. 원저자인 Ian Back은 자신의 웹 사이트에서 "즉시" PDF 파일을 출력하고 다양한 언어를 처리하기 위해 mPDF를 작성했습니다. HTML2FPDF와 같은 원본 스크립트보다 유니코드 글꼴을 사용할 때 속도가 느리고 더 큰 파일을 생성하지만 CSS 스타일 등을 지원하고 많은 개선 사항이 있습니다. RTL(아랍어, 히브리어), CJK(중국어, 일본어, 한국어)를 포함한 거의 모든 언어를 지원합니다. 중첩된 블록 수준 요소(예: P, DIV)를 지원합니다.