高难度的来了,C#调用C++库函数,库函数里的结构体里有函数,这怎么引用?

热情的菜鸟 2020-06-03 04:42:03
//先道个歉,只有85分了,很久不来了。
//以下是C++头文件
//回调函数定义;每个回调函数既是返回的一个事件点。
typedef struct {
//命令发送成功,目标设备有响应。
void (*PTK_UserCommandSuccessful)(const void* sender, uint receid, uchar hostid, uchar terid, uchar commandcode);
//命令发送失败,目标设备无响应。
void (*PTK_UserCommandDelete)(const void* sender, uint receid, uchar hostid, uchar terid, uchar commandcode);
//报警信息
void (*PTK_Alarm_Information)(const void* sender, uint receid, uchar hostid, uchar terid, uchar areaid, EPTK_Alarm_Event Eventcode);
// 键盘显示 需主机为V3.3以上版本才有响应
void (*PTK_Alarm_KpdDisplay)(const void* sender, uint receid, uchar hostid, uchar* Dis1, uchar* Dis2);
}SPTK_callbackFun;

//DLL初始化函数:完成内存分配,线程开启等操作,获取相应的充分的系统资源。
PTKALARMLIB_API void* Init_PTKAlarmlib(const void* sender, SPTK_callbackFun* CallBack);


@版主
...全文
290 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
杀马特丶蛮牛 2020-06-08
  • 打赏
  • 举报
回复
报警信息的没转换,其他几个转换了一下


/// Return Type: void
///sender: void*
///receid: int
///hostid: char
///terid: char
///commandcode: char
public delegate void _PTK_UserCommandSuccessful(System.IntPtr sender, int receid, byte hostid, byte terid, byte commandcode);

/// Return Type: void
///sender: void*
///receid: int
///hostid: char
///terid: char
///commandcode: char
public delegate void _PTK_UserCommandDelete(System.IntPtr sender, int receid, byte hostid, byte terid, byte commandcode);

/// Return Type: void
///sender: void*
///receid: int
///hostid: char
///Dis1: char*
///Dis2: char*
public delegate void _PTK_Alarm_KpdDisplay(System.IntPtr sender, int receid, byte hostid, System.IntPtr Dis1, System.IntPtr Dis2);

[System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)]
public struct SPTK_callbackFun {
    
    /// _PTK_UserCommandSuccessful
    public _PTK_UserCommandSuccessful AnonymousMember1;
    
    /// _PTK_UserCommandDelete
    public _PTK_UserCommandDelete AnonymousMember2;
    
    /// _PTK_Alarm_KpdDisplay
    public _PTK_Alarm_KpdDisplay AnonymousMember3;
}

public partial class NativeMethods {
    
    /// Return Type: void*
    ///sender: void*
    ///CallBack: SPTK_callbackFun*
    [System.Runtime.InteropServices.DllImportAttribute("<Unknown>", EntryPoint="Init_PTKAlarmlib")]
public static extern  System.IntPtr Init_PTKAlarmlib(System.IntPtr sender, ref SPTK_callbackFun CallBack) ;

zxy2847225301 2020-06-07
  • 打赏
  • 举报
回复
数据类型的是结构体的我没有试过,你这边的C++代码的数据类型结构体,C#这边传入也应该是结构体,而且你C++这边有不定性的指针,需要把C++的代码贴出来才能决定C#这边该如何传入数据
xian_wwq 2020-06-06
  • 打赏
  • 举报
回复
1.基本类型要正确对应 2. StructLayout特性支持三种附加字段:CharSet、Pack、Size 需要显示定义,任何一项不对应都会导致错误 3.回调函数需要用委托来对应
键盘敲出字 2020-06-06
  • 打赏
  • 举报
回复
你的定义看起来好多都不对。
首先,uint和uchar你需要查看文件中是如何定义的,这样子才是能确定对应的类型,单单从名称来看像是无符号32和无符号8。
其次,结构体里面是回调函数,对应的应该是委托。
应该是像这个样子

//这里假定
//uint = unsigned int = 无符号32 = C# uint
//uchar = unsigned char = 无符号8 = C# byte
//实际你需要根据C++文件的实际定义查看然后转成对应的C#类型
public delegate void _PTK_UserCommandSuccessful(System.IntPrt sender,uint receid, byte hostid, byte terid, byte commandcode);
//其余省略...

[StructLayout( LayoutKind.Sequential )]
public struct SPTK_callbackFun {
public _PTK_UserCommandSuccessful PTK_UserCommandSuccessful;
//其余省略...
}


热情的菜鸟 2020-06-04
  • 打赏
  • 举报
回复
热情的菜鸟 2020-06-03
  • 打赏
  • 举报
回复
目前C#代码是这样写的,可是行不通。x86也设置了。
        //回调函数定义;每个回调函数既是返回的一个事件点。
        [StructLayout( LayoutKind.Sequential )]
        public struct SPTK_callbackFun {
            [DllImport( "AlarmSDK.dll", EntryPoint = "PTK_UserCommandSuccessful", CallingConvention = CallingConvention.StdCall )]
            public static extern IntPtr PTK_UserCommandSuccessful( ref byte sender, System.UInt16 receid, int hostid, int terid, int commandcode );

            [DllImport( "AlarmSDK.dll", EntryPoint = "PTK_UserCommandDelete", CallingConvention = CallingConvention.StdCall )]
            public static extern IntPtr PTK_UserCommandDelete( ref byte sender, System.UInt16 receid, int hostid, int terid, int commandcode );

            [DllImport( "AlarmSDK.dll", EntryPoint = "PTK_Alarm_Information", CallingConvention = CallingConvention.StdCall )]
            public static extern IntPtr PTK_Alarm_Information( ref byte sender, System.UInt16 receid, int hostid, int terid, int areaid, EPTK_Alarm_Event Eventcode );

            [DllImport( "AlarmSDK.dll", EntryPoint = "PTK_Alarm_KpdDisplay", CallingConvention = CallingConvention.StdCall )]
            public static extern IntPtr PTK_Alarm_KpdDisplay( ref byte sender, System.UInt16 receid, int hostid, int Dis1, int Dis2 );
        }

        //PTKALARMLIB_API void* Init_PTKAlarmlib(const void* sender, SPTK_callbackFun* CallBack);
        [DllImport( "AlarmSDK.dll", EntryPoint = "Init_PTKAlarmlib", CallingConvention = CallingConvention.StdCall )]
        public static extern IntPtr P_Client_QueryRecord( ref byte zero, ref SPTK_callbackFun pInfo );
热情的菜鸟 2020-06-03
  • 打赏
  • 举报
回复

110,567

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧