c++函数转c#函数示例程序分享

代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace FDEP
{
    /// <summary>
    /// 罗旭成
    /// 深证通函数转换
    /// </summary>
    public class ImportDLL
    {
        #region * 常量定义
        //*****************************************************************
        //协议类型常量
        //名称                             定义值     说明
        //MR_PROTOCOLTYPE_MRSTANDAND       0x01      FDEP规定的标识业务协议
        //MR_PROTOCOLTYPE_SELFCUSTOM       0xFF      用户自定义协议类型
        /// <summary>
        /// 协议类型常量
        /// </summary>
        public const uint MR_PROTOCOLTYPE_MRSTANDAND = 0x01; // SBSP标准业务协议。
        public const uint MR_PROTOCOLTYPE_SELFCUSTOM = 0xFF; // 用户自定义协议类型。
        //*****************************************************************
        //消息标识位常量
        //名称                             定义值     说明
        //MR_MSGFLAG_PERSIST               0x01      持久消息标志,用于可靠传输。目前暂不支持
        //MR_MSGFLAG_COMPRESS              0x02      压缩标志,需进行压缩传输
        /// <summary>
        /// 消息标志位常量
        /// </summary>

public const uint MR_MSGFLAG_PERSIST = 0x01; // 持久消息标志,用于可靠传输。
        public const uint MR_MSGFLAG_COMPRESS = 0x02; // 压缩标志,需进行压缩传输。
        //*****************************************************************
        //长度常量
        //名称                             定义值     说明
        //MR_MAXLEN_ADDR                   64        用户标识及应用标识的最大长度
        //MR_MAXLEN_PKGID                  64        消息包标识的最大长度
        //MR_MAXLEN_USERDATA               256       用户保留数据的最大长度
        //MR_FIXLEN_EXPIREDABSTIME         20        过期绝对时间固定长度
        /// <summary>
        /// 消息标志位常量
        /// </summary>
        public const int MR_MAXLEN_ADDR = 64; // 用户标识及应用标识的最大长度。
        public const int MR_MAXLEN_PKGID = 64; // 消息包标识的最大长度。
        public const int MR_MAXLEN_USERDATA = 256; // 用户保留数据的最大长度。
        public const int MR_FIXLEN_EXPIREDABSTIME = 20; // 过期绝对时间固定长度。
        //*****************************************************************
        //函数返回错误值
        //MR_ERRCODE_OK                   0
        //MR_ERRCODE_PARAMERR             -1
        //MR_ERRCODE_CONNERR              -2
        //MR_ERRCODE_TIMEEXPIRED          -3
        //MR_ERRCODE_TIMEOUT              -4
        //MR_ERRCODE_NOMSG                -5
        //MR_ERRCODE_BUFTOOSHORT          -6
        //MR_ERRCODE_BUFTOOBIG            -7
        //MR_ERRCODE_SYSERROR             -8
        #endregion

#region * 结构体的定义
        /// <summary>
        /// 用来表示一条消息的各种属性
        /// </summary>
        [StructLayout(LayoutKind.Sequential)]
        public struct STUsgProperty
        {
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = MR_MAXLEN_ADDR)]
            public string m_szSourceUserID;//MR_MAXLEN_ADDR 源用户标识,以“\0”结尾的字符串
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = MR_MAXLEN_ADDR)]
            public string m_szSourceAppID;//MR_MAXLEN_ADDR 源应用标识,以“\0”结尾的字符串
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = MR_MAXLEN_ADDR)]
            public string m_szDestUserID;//MR_MAXLEN_ADDR 目的用户标识,以“\0”结尾的字符串
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = MR_MAXLEN_ADDR)]
            public string m_szDestAppID;//MR_MAXLEN_ADDR 目的应用标识,以“\0”结尾的字符串
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = MR_MAXLEN_PKGID)]
            public string m_szPkgID;//MR_MAXLEN_PKGID 消息包的包标识,以“\0”结尾的字符串,或者由用户调用MrCreatePkgID函数生成,或者为空(即'\0')
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = MR_MAXLEN_PKGID)]
            public string m_szCorrPkgID;//MR_MAXLEN_PKGID 相关包标识,以“\0”结尾的字符串,供用户自用
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = MR_MAXLEN_USERDATA)]
            public string m_szUserData1;//MR_MAXLEN_USERDATA 用户数据1,以“\0”结尾的字符串,供用户自用
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = MR_MAXLEN_USERDATA)]
            public string m_szUserData2;//MR_MAXLEN_USERDATA 用户数据2,以“\0”结尾的字符串,供用户自用
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = MR_FIXLEN_EXPIREDABSTIME)]
            public string m_szExpiredAbsTime;//MR_FIXLEN_EXPIREDABSTIME 该消息的过期时间,以“\0”结尾的字符串,格式为“YYYY-MM-DD HH:MM:SS”。也可以置空,此时如果目的用户不在线,或者目的应用未连接,则消息立即过期。
            public byte m_ucFlag;//消息标识,有8个二进制位组成,各位含义如下:位0 --为1表示持久消息,需可靠传输,暂不支持;
            //位1 --为1表示消息需压缩传输
            public byte m_ucProtocolType;//协议类型标识,取值可以是下列之一:MR_PROTOCOLTYPE_MRSTANDAND  0x01  FDEP规定的标准业务协议
            //MR_PROTOCOLTYPE_SELFCUSTOM  0xFF  用户自定义协议类型
        }

/// <summary>
        /// 用来定义与接入客户端建立连接所需的各种信息
        /// </summary>
        [StructLayout(LayoutKind.Sequential)]
        public struct STUConnInfo
        {
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 16)]
            public string m_szMRIP;//接入客户端消息路由器的IP地址,以"\0"结尾的字符串,格式为“xxx.xxx.xxx.xxx”
            public UInt16 m_usMRPort;//接入客户端消息路由器的连接端口
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 16)]
            public string m_szMRIPBak;//备用消息路由器的IP地址,不设置备用消息路由器时可以为空
            public UInt16 m_usMRPortBak;//备用消息路由器的连接端口,不设置备用消息路由器时可以为0
        }
        #endregion

#region * 函数的定义
        /// <summary>
        /// 定义的回调函数
        /// </summary>
        /// <param name="psPkg">要发送的消息包缓冲区</param>
        /// <param name="iPkgLen">缓冲区中的消息包长度</param>
        /// <param name="pMsgPropery">消息包属性</param>
        /// <param name="pvUserData">供回调函数使用的用户数据</param>
        /// <returns></returns>
        [UnmanagedFunctionPointerAttribute(CallingConvention.StdCall)]
        public delegate int OnReceiveCallBack(string psPkg, int iPkgLen, ref STUsgProperty pMsgPropery, IntPtr pvUserData);
        //typedef int (*OnReceiveCallBack)(const char* psPkg, int iPkgLen, const STUMsgProperty* pMsgPropery, void* pvUserData);

/// <summary>
        /// 1.初始化,获取相关资源,并尝试与接入客户端FDAP建立连接
        /// </summary>
        /// <param name="psAppID">本应用的应用标识</param>[in]
        /// <param name="psPasswd">本应用在接入客服端设置的密码,密码必须与预设的匹配才能继续</param>[in]
        /// <param name="onReceive">接收到消息包时的回调函数</param>[in]
        /// <param name="oConnInfo">接入客户端连接信息</param>[in]
        /// <param name="pvUserData">供回调函数使用的用户数据</param>[in]
        /// <returns>NULL 初始化失败 非NULL 初始化成功,返回一个连接句柄,给句柄将作为其他函数调用的参数</returns>
        [DllImport("mrapi.dll", EntryPoint = "MrInit", CallingConvention = CallingConvention.StdCall, SetLastError = true, CharSet = CharSet.Ansi)]
        public static extern IntPtr MrInit(string psAppID, string psPasswd, OnReceiveCallBack onReceive, STUConnInfo oConnInfo, IntPtr pvUserData);
        //void* _stdcall MrInit(const char* psAppID, const char* psAppPasswd,OnReceiveCallBack onReceive,const STUConnInfo oConnInfo, void* pvUserData);

/// <summary>
        /// 2.初始化,获取相关资源,并尝试与接入客户端FDAP建立连接
        /// </summary>
        /// <param name="psUserCertID">本应用的用户标识</param>[in]
        /// <param name="psAppID">本应用的应用标识</param>[in]
        /// <param name="psPasswd">本应用在接入客服端设置的密码,密码必须与预设的匹配才能继续</param>[in]
        /// <param name="onReceive">接收到消息包时的回调函数</param>[in]
        /// <param name="oConnInfo">接入客户端连接信息</param>[in]
        /// <param name="pvUserData">供回调函数使用的用户数据</param>[in]
        /// <returns>NULL 初始化失败 非NULL 初始化成功,返回一个连接句柄,给句柄将作为其他函数调用的参数</returns>
        [DllImport("mrapi.dll", EntryPoint = "MrInit1", CallingConvention = CallingConvention.StdCall, SetLastError = true, CharSet = CharSet.Ansi)]
        public static extern IntPtr MrInit1(string psUserCertID, string psAppID, string psPasswd, OnReceiveCallBack onReceive, STUConnInfo oConnInfo, IntPtr pvUserData);

/// <summary>
        /// 3.连接FDAP时的初始化函数。该函数对FDEAPI进行初始化,分配获取相关资源,并尝试与接入客户端建立通信连接
        /// </summary>
        /// <param name="pHandle">函数返回的句柄,该句柄将作为其他函数调用的参数</param>[out]
        /// <param name="psUserCertID">本应用的用户标识</param>[in]
        /// <param name="psAppID">本应用的应用标识</param>[in]
        /// <param name="psPasswd">本应用在接入客户端设置的密码,密码必须与预设的匹配才能继续</param>[in]
        /// <param name="pMsgProperty">消息包属性</param>[in]
        /// <param name="onReceive">接收到消息包时的回调函数</param>[in]
        /// <param name="oConnInfo">接入客户端连接信息</param>[in]
        /// <param name="pvUserData">供回调函数使用的用户数据</param>[in]
        /// <param name="iThreadCount">调用回头函数OnReceive的线程数目</param>[in]
        /// <returns>无</returns>
        [DllImport("mrapi.dll", EntryPoint = "MrInit1Ex1", CallingConvention = CallingConvention.StdCall, SetLastError = true, CharSet = CharSet.Ansi)]
        public static extern IntPtr MrInit1Ex1(out IntPtr pHandle, string psUserCertID, string psAppID, string psPasswd, ref STUsgProperty pMsgProperty, OnReceiveCallBack onReceive, STUConnInfo oConnInfo, IntPtr pvUserData, int iThreadCount);

/// <summary>
        /// 4.连接FDAP时的初始化函数。该函数对FDEAPI进行初始化,分配获取相关资源,并尝试与接入客户端建立通信连接
        /// </summary>
        /// <param name="pHandle">函数返回的句柄,该句柄将作为其他函数调用的参数</param>[out]
        /// <param name="psAppID">本应用的应用标识</param>[in]
        /// <param name="psPassws">本应用在接入客户端设置的密码,密码必须与预设的匹配才能继续</param>[in]
        /// <param name="pOnRecvMsgPropery">这是回调函数OnReceive的接收条件,如果不需要任何条件,则可以填NULL</param>[in]
        /// <param name="onReceive">接收到消息包时的回调函数</param>[in]
        /// <param name="pConnInfo">接入客户端连接信息</param>[in]
        /// <param name="pvUserData">供回调函数使用的用户数据</param>[in]
        /// <param name="iThreadCount">调用回头函数OnReceive的线程数目</param>
        /// <returns>无</returns>
        [DllImport("mrapi.dll", EntryPoint = "MrInit2", CallingConvention = CallingConvention.StdCall, SetLastError = true, CharSet = CharSet.Ansi)]
        public static extern IntPtr MrInit2(out IntPtr pHandle, string psAppID, string psPassws, ref STUsgProperty pOnRecvMsgPropery, OnReceiveCallBack onReceive, ref STUConnInfo pConnInfo, IntPtr pvUserData, int iThreadCount);
        //void*  _stdcall MrInit2(void** ppHandle, const char* psAppID, const char* psAppPasswd, STUMsgProperty* pOnRecvMsgPropery,OnReceiveCallBack onReceive,const STUConnInfo* pConnInfo, void* pvUserData, int iThreadCount);

/// <summary>
        /// 5.判断与交换中枢的连接是否正常
        /// </summary>
        /// <param name="pHandle">连接句柄,调用MrInit时返回的值</param>
        /// <returns>0不正常 1正常</returns>
        [DllImport("mrapi.dll", EntryPoint = "MrIsLinkOK", CallingConvention = CallingConvention.StdCall, SetLastError = true, CharSet = CharSet.Ansi)]
        public static extern int MrIsLinkOK(IntPtr pHandle);
        //int  _stdcall MrIsLinkOK(void* pHandle)

/// <summary>
        /// 6.消息包标识生成函数
        /// </summary>
        /// <param name="pHandle">连接句柄,调用MrInit时返回的值</param>[in]
        /// <param name="szPkgID">生成的消息包标识</param>[out]
        /// <returns>0 成功 其他 失败</returns>
        [DllImport("mrapi.dll", EntryPoint = "MrCreatePkgID", CallingConvention = CallingConvention.StdCall, SetLastError = true, CharSet = CharSet.Ansi)]
        public static extern int MrCreatePkgID(IntPtr pHandle, StringBuilder szPkgID);
        //int _stdcall MrCreatePkgID(void* pHandle,char szPkgID[MR_MAXLEN_PKGID])

/// <summary>
        /// 7.消息包发送函数
        /// </summary>
        /// <param name="pHandle">连接句柄,调用MrInit时返回的值</param>[in]
        /// <param name="psPkg">要发送的消息包缓冲区</param>[in]
        /// <param name="iPkgLen">缓冲区中的消息包长度</param>[in]
        /// <param name="pMsgPropery">消息包属性</param>[in/out]
        /// <param name="iMillSecTimeo">以毫米为单位的接收最大超时时间</param>[in]
        /// <returns>0 成功 其他 失败</returns>
        [DllImport("mrapi.dll", EntryPoint = "MrSend", CallingConvention = CallingConvention.StdCall, SetLastError = true, CharSet = CharSet.Ansi)]
        public static extern int MrSend(IntPtr pHandle, string psPkg, int iPkgLen, ref STUsgProperty pMsgPropery, int iMillSecTimeo);
        //int _stdcall MrSend(void* pHandle,const char* psPkg,int iPkgLen,STUsgProperty* pMsgPropery,int iMillSecTimeo);

/// <summary>
        /// 8.消息包接收函数1
        /// </summary>
        /// <param name="pHandle">连接句柄,调用MrInit时返回的值</param>[in]
        /// <param name="ppsPkg">双指针,返回包所指向的内存</param>[out]
        /// <param name="piOutPkgLen">接收到消息包的实际长度</param>[out]
        /// <param name="pMsgPropery">接收条件</param>[in/out]
        /// <param name="iMillSecTimeo">以毫米为单位的接收最大超时时间</param>[in]
        /// <returns>0 成功 其他 失败</returns>
        [DllImport("mrapi.dll", EntryPoint = "MrReceive1", CallingConvention = CallingConvention.StdCall, SetLastError = true, CharSet = CharSet.Ansi)]
        public static extern int MrReceive1(IntPtr pHandle, out IntPtr ppsPkg, out int piOutPkgLen, ref STUsgProperty pMsgPropery, int iMillSecTimeo);
        //int _stdcall MrReceive1(void* pHandle, char** ppsPkg, int* piOutPkgLen, STUMsgProperty* pMsgPropery, int iMillSecTimeo);

/// <summary>
        /// 9.消息包内存释放函数
        /// </summary>
        /// <param name="psPkg">由MrReceivel1函数的第二个参数返回的指针</param>[in]
        /// <returns>无</returns>
        [DllImport("mrapi.dll", EntryPoint = "MrReceive1_FreeBuf", CallingConvention = CallingConvention.StdCall, SetLastError = true, CharSet = CharSet.Ansi)]
        public static extern IntPtr MrReceive1_FreeBuf(string psPkg);
        //void _stdcall MrReceive1_FreeBuf(char* psPkg);

/// <summary>
        /// 10.消息包浏览函数
        /// </summary>
        /// <param name="pHandle">连接句柄,调用MrInit时返回的值</param>[in]
        /// <param name="piOutPkgLen">接收到消息包的实际长度</param>[out]
        /// <param name="pMsgPropery">接收条件</param>[in/out]
        /// <param name="iMillSecTimeo">以毫米为单位的接收最大超时时间</param>[in]
        /// <returns>0 成功 其他 失败</returns>
        [DllImport("mrapi.dll", EntryPoint = "MrBrowse", CallingConvention = CallingConvention.StdCall, SetLastError = true, CharSet = CharSet.Ansi)]
        public static extern int MrBrowse(IntPtr pHandle, out int piOutPkgLen, ref STUsgProperty pMsgPropery, int iMillSecTimeo);
        //int _stdcall MrBrowse(void* pHandle,  int* piOutPkgLen, STUMsgProperty* pMsgPropery, int iMillSecTimeo);

/// <summary>
        /// 11.消息包接收函数2
        /// </summary>
        /// <param name="pHandle">连接句柄,调用MrInit时返回的值</param>[in]
        /// <param name="ppsPkg">双指针,返回包所指向的内存</param>[out]
        /// <param name="piOutPkgLen">接收到消息包的实际长度</param>[out]
        /// <param name="iBufLenIn">消息包缓冲区大小</param>[out]
        /// <param name="pMsgPropery">接收条件</param>[in/out]
        /// <param name="iMillSecTimeo">以毫米为单位的接收最大超时时间</param>[in]
        /// <returns>0 成功 其他 失败</returns>
        [DllImport("mrapi.dll", EntryPoint = "MrReceive2", CallingConvention = CallingConvention.StdCall, SetLastError = true, CharSet = CharSet.Ansi)]
        public static extern int MrReceive2(IntPtr pHandle, out IntPtr ppsPkg, out int piOutPkgLen, out int iBufLenIn, ref STUsgProperty pMsgPropery, int iMillSecTimeo);
        //int _stdcall MrReceive2(void* pHandle, char** ppsPkg, int* piOutPkgLen, int* iBufLenIn, STUMsgProperty* pMsgPropery, int iMillSecTimeo);

/// <summary>
        /// 12.消息包接收函数3
        /// </summary>
        /// <param name="pHandle">连接句柄,调用MrInit时返回的值</param>[in]
        /// <param name="ppsPkg">双指针,返回包所指向的内存</param>[out]
        /// <param name="piOutPkgLen">接收到消息包的实际长度</param>[out]
        /// <param name="piErrSXCode">交换错误的原因码</param>[out]
        /// <param name="pMsgPropery">接收条件</param>[in/out]
        /// <param name="iMillSecTimeo">以毫米为单位的接收最大超时时间</param>[in]
        /// <returns>0 成功 其他 失败</returns>
        [DllImport("mrapi.dll", EntryPoint = "MrReceive3", CallingConvention = CallingConvention.StdCall, SetLastError = true, CharSet = CharSet.Ansi)]
        public static extern int MrReceive3(IntPtr pHandle, out IntPtr ppsPkg, out int piOutPkgLen, out int piErrSXCode, ref STUsgProperty pMsgPropery, int iMillSecTimeo);
        //int _stdcall MrReceive3(void* pHandle, char** ppsPkg, int* piOutPkgLen, int* piErrSXCode, STUMsgProperty* pMsgPropery, int iMillSecTimeo);

/// <summary>
        /// 13.消息包接收函数4
        /// </summary>
        /// <param name="pHandle">连接句柄,调用MrInit时返回的值</param>[in]
        /// <param name="ppsPkg">双指针,返回包所指向的内存</param>[out]
        /// <param name="piOutPkgLen">接收到消息包的实际长度</param>[out]
        /// <param name="piErrSXCode">交换错误的原因码</param>[out]
        /// <param name="pMsgPropery">接收条件</param>[in/out]
        /// <param name="iMillSecTimeo">以毫米为单位的接收最大超时时间</param>[in]
        /// <returns>0 成功 其他 失败</returns>
        [DllImport("mrapi.dll", EntryPoint = "MrReceive4", CallingConvention = CallingConvention.StdCall, SetLastError = true, CharSet = CharSet.Ansi)]
        public static extern int MrReceive4(IntPtr pHandle, out IntPtr ppsPkg, out int piOutPkgLen, out int piErrSXCode, ref STUsgProperty pMsgPropery, int iMillSecTimeo);
        //int _stdcall MrReceive4(void* pHandle, char** ppsPkg, int* piOutPkgLen, int* piErrSXCode, STUMsgProperty* pMsgPropery, int iMillSecTimeo);

/// <summary>
        /// 14.释放资源
        /// </summary>
        /// <param name="pHandle">连接句柄,调用MrInit时返回的值</param>
        /// <returns>无</returns>
        [DllImport("mrapi.dll", EntryPoint = "MrDestroy", CallingConvention = CallingConvention.StdCall, SetLastError = true, CharSet = CharSet.Ansi)]
        public static extern IntPtr MrDestroy(IntPtr pHandle);
        //void _stdcall MrDestroy(void* pHandle)

/// <summary>
        /// 15.取得本API的版本号
        /// </summary>
        /// <param name="psBufVersion">返回的版本号</param>
        /// <param name="iBufLen">版本号长度</param>
        /// <returns>无</returns>
        [DllImport("mrapi.dll", EntryPoint = "MrGetVersion", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi)]
        public static extern IntPtr MrGetVersion(StringBuilder psBufVersion, int iBufLen);
        //void _stdcall MrGetVersion(char* psBufVersion,int iBufLen);

/// <summary>
        /// 16.注册包下推条件
        /// </summary>
        /// <param name="pHandle">连接句柄,调用MrInit时返回的值<</param>
        /// <param name="pMsgPropery">消息的结构实体</param>
        /// <param name="iType">0 增加一个条件 1 删除一个条件 2 清空所有条件</param>
        /// <returns>0 成功 其他 失败</returns>
        [DllImport("mrapi.dll", EntryPoint = "MrRegRecvCondition", CallingConvention = CallingConvention.StdCall, SetLastError = true, CharSet = CharSet.Ansi)]
        public static extern int MrRegRecvCondition(IntPtr pHandle, ref STUsgProperty pMsgPropery, int iType);
        //int _stdcall MrRegRecvCondition(void* pHandle,STUMsgProperty* pMsgPropery,int iType);
        #endregion
    }
}

(0)

相关推荐

  • C++调用C#的DLL程序实现方法

    把C#编译成DLL或者Axtive控件,再由C调用!比如使用C++调用C#的DLL. SwfDotNet是.net下输出flash的类库.SwfDotNet是C#编写的,作者的C#水平,真是令我佩服.这是个特别好的读写Swf文件的库.但是,我要用在C++项目中,怎么让C++调用C#的DLL呢.今天一上午都在琢磨这个问题,耽误了很多时间,原因是编译是出现:warning C4819: 该文件包含不能在当前代码页(936)中表示的字符.请将该文件保存为 Unicode 格式以防止数据丢失. 接着就是

  • C++联合体转换成C#结构的实现方法

    本文实例主要参考MSDN:http://msdn.microsoft.com/zh-cn/library/ya9bz4ha%28v=vs.80%29.aspx 最近因为项目中遇到了C++联合体转换成C#结构的情况,查了很多资料才转换成功. 备注:对于官方这个UNION示例,我的简单理解,就是这类UNION做法,可适当代替IF ELSE 之类操作. 解决问题:如果只接收视频解码数据,而从不接收音频数据,那么是否可以直接定义结构体,并以此来获取视频数据. /// <summary> /// * @

  • C#调用C++版本dll时的类型转换需要注意的问题小结

    C#对于C++的dll引用时,经常会遇到类型转换和struct的转换 1. C++ 里的Char类型是1 个字节,c#里的Char是两个字节,不可以对应使用:可使用c#里的byte对应 2. structType temp = (structType)Marshal.PtrToStructure(IntPtr, typeof(structType));说明:此方式转换只针对包含c++基本类型的结构体,如果包含指针数组的结构体,使用泛型函数比较方便. 3. [StructLayoutAttribu

  • C# 调用C++写的dll的实现方法

    dll的编写,首先是打开VS新建一个C++的控制台程序,下一步后选择dll以及空文档即可.然后就是添加一个类添加一个方法.方法排头固定格式 extern"C"__declspec(dllexport) 后面加方法即可. 例如如下代码: C++dll代码: 复制代码 代码如下: extern"C"__declspec(dllexport) char* ShowImages(BYTE img[],int w,int h){;} C#调用dll基本也是固定格式,如下样式,

  • C#统计C、C++及C#程序代码行数的方法

    本文实例讲述了C#统计C.C++及C#程序代码行数的方法.分享给大家供大家参考.具体如下: 本文中的两个函数 1)用于统计扩展名为 .h .c .cpp .cs 文件的代码行数 public static int LinesOfCode(string filename) 2)用于递归统计一个文件夹内所有扩展名为 .h .c .cpp .cs 文件的代码行数 public static int LinesOfFolder(string foldername) 一.什么样的情况算一行代码 需要注意如

  • C++与C#互调dll的实现步骤

    本文实例展示了C++与C#互调dll的实现步骤,在进行大型项目共享dll动态链接库中可以用到.具体方法如下: 一.C#调用C++ dll步骤(只能导出方法): 1. c++建立空项目->源文件文件夹中添加cpp文件和函数 2. c++属性设置中,配置类型设置为动态库dll,公共语言运行时支持改为/clr 3. c#引用c++的dll 4. c#声明c++的方法,并添加 DllImport特性 5. c#工程属性设置为:目标平台x86 6. 注意方法的类型匹配 7. 引发PInvokeStackI

  • c++与c#的时间转换示例分享

    1.C++中的时间:(1) time_t其实是一个64位的long int类型(2) time函数:函数简介:函数名:  time 头文件:  time.h 函数原型:time_t time(time_t *timer) 功能: 获取当前的系统时间,返回的结果是一个time_t类型,其实就是一个大整数,其值表示从CUT(Coordinated Universal Time)时间1970年1月1日00:00:00(称为UNIX系统的Epoch时间)到当前时刻的秒数,然后调用localtime将ti

  • C++调用C#的DLL实现方法

    SwfDotNet是C#编写的,这是个特别好的读写Swf文件的库.本文讲述了在C++项目中,怎么让C++调用C#的DLL动态链接库文件. 具体的实现步骤如下: 一.创建C# DLL,需要指定应用类型为"类库",代码: namespace CSLib { public class Class1 { private string name; public string Name { get { return name; } set { name = "Your Name: &qu

  • C#如何调用原生C++ COM对象详解

    前言 最近在工作中遇到一个问题,为了跨平台在.net core中使用COM,不能使用Windows下的COM注册机制,但是可以直接把IUnknown指针传给C#,转换为指针,再转换为C#的接口(interface). 做了这方面的研究,但最终我没有使用这套技术,因为对IDispatch::Invoke的分发太麻烦了,又不能借助ATL与VS开发环境的IDL能力.所以没有继续研究事件订阅(C#是event,C++COM是IConnectionPoint). C++中需要做的: 简单点,实现IDisp

  • c++函数转c#函数示例程序分享

    复制代码 代码如下: using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Runtime.InteropServices;using System.Windows.Forms; namespace FDEP{    /// <summary>    /// 罗旭成    /// 深证通函数转换    /// </summary>    publi

  • oracle中decode函数的使用方法示例

    decode的几种用法 1:使用decode判断字符串是否一样 DECODE(value,if1,then1,if2,then2,if3,then3,...,else) 含义为 IF 条件=值1 THEN RETURN(value 1) ELSIF 条件=值2 THEN RETURN(value 2) ...... ELSIF 条件=值n THEN RETURN(value 3) ELSE RETURN(default) END IF sql测试 select empno,decode(empn

  • Go语言的变量、函数、Socks5代理服务器示例详解

    Go语言中变量的声明和JavaScript很像,使用var关键字,变量的声明.定义有好几种形式 1. 变量和常量 // 声明并初始化一个变量 var m int = 10 // 声明初始化多个变量 var i, j, k = 1, 2, 3 // 多个变量的声明(注意小括号的使用) var( no int name string ) // 声明时不指明类型,通过初始化值来推导 var b = true // bool型 // := 隐含声明变量并赋值 str := "mimvp.com"

  • C++中函数指针详解及代码分享

    函数指针 函数存放在内存的代码区域内,它们同样有地址.如果我们有一个int test(int a)的函数,那么,它的地址就是函数的名字,如同数组的名字就是数组的起始地址. 1.函数指针的定义方式:data_types (*func_pointer)( data_types arg1, data_types arg2, ...,data_types argn); c语言函数指针的定义形式:返回类型 (*函数指针名称)(参数类型,参数类型,参数类型,-); c++函数指针的定义形式:返回类型 (类名

  • PHP实现动态获取函数参数的方法示例

    本文实例讲述了PHP实现动态获取函数参数的方法.分享给大家供大家参考,具体如下: PHP 在用户自定义函数中支持可变数量的参数列表.其实很简单,只需使用 func_num_args() , func_get_arg() ,和 func_get_args()  函数即可. 可变参数并不需要特别的语法,参数列表仍按函数定义的方式传递给函数,并按通常的方式使用这些参数. 1. func_num_args - 返回传入函数的参数总个数 int func_num_args ( void ) 示例 <?ph

  • pandas apply 函数 实现多进程的示例讲解

    前言: 在进行数据处理的时候,我们经常会用到 pandas .但是 pandas 本身好像并没有提供多进程的机制.本文将介绍如何来自己实现 pandas (apply 函数)的多进程执行.其中,我们主要借助 joblib库,这个库为python 提供了一个非常简洁方便的多进程实现方法. 所以,本文将按照下面的安排展开,前面可能比较啰嗦,若只是想知道怎么用可直接看第三部分: - 首先简单介绍 pandas 中的分组聚合操作 groupby. - 然后简单介绍 joblib 的使用方法. - 最后,

  • python调用其他文件函数或类的示例

    B.py调用A.py的函数或类 在同一个文件夹下 调用函数: A.py文件: def add(x,y): print('和为:%d'%(x+y)) B.py文件: import A A.add(1,2) 或 from A import add add(1,2) 调用类: A.py文件: class A: def __init__(self,xx,yy): self.x=xx self.y=yy def add(self): print("x和y的和为:%d"%(self.x+self.

  • 对python实现二维函数高次拟合的示例详解

    在参加"数据挖掘"比赛中遇到了关于函数高次拟合的问题,然后就整理了一下源码,以便后期的学习与改进. 在本次"数据挖掘"比赛中感觉收获最大的还是对于神经网络的认识,在接近一周的时间里,研究了进40种神经网络模型,虽然在持续一周的挖掘比赛把自己折磨的惨不忍睹,但是收获颇丰.现在想想也挺欣慰自己在这段时间里接受新知识的能力.关于神经网络方面的理解会在后续博文中补充(刚提交完论文,还没来得及整理),先分享一下高次拟合方面的知识. # coding=utf-8 import

  • python绘图subplots函数使用模板的示例代码

    背景 使用python进行图像可视化,很多情况下都需要subplots将多幅图像绘制在一个figure中.因为使用频率足够高,那么程序员就需要将其"封装",方便复用,所以,这里将笔者常用的subplots用法记录之. 如果有python绘图使用subplots出现标题重叠的解决方法 的问题,可以参考之. 模板 显示中文 plt.rcParams['font.sans-serif'] = ['SimHei'] # 显示中文 使用subplot(221) 对应的subplots代码: fr

  • C语言函数声明以及函数原型超详细讲解示例

    C语言代码由上到下依次执行,原则上函数定义要出现在函数调用之前,否则就会报错.但在实际开发中,经常会在函数定义之前使用它们,这个时候就需要提前声明. 所谓声明(Declaration),就是告诉编译器我要使用这个函数,你现在没有找到它的定义不要紧,请不要报错,稍后我会把定义补上. 函数声明的格式非常简单,相当于去掉函数定义中的函数体,并在最后加上分号;,如下所示: dataType functionName( dataType1 param1, dataType2 param2 ... ); 也

随机推荐