凡夫俗子_ 2017-08-03 05:57 采纳率: 0%
浏览 869
已结题

c#调用dll库。一个奇怪的问题~

现在要做的事情是需要用c#调用c++写的dll,当dll(dll怎样跟硬件通讯的不管)读取到卡片信息时,通过回调函数把卡片信息传递到C#这边来

 c# 这边调用此方法设置回调函数:
 [DllImport("TCP102_SDK.dll", EntryPoint = "?TCP102_InitCallBack@@YGEKPAU_CALLBACK_FUN@@@Z")]
 public unsafe static extern byte TCP105_InitCallBack(uint dwUser, ref CALLBACK_FUN p_call_back);troller@@YGEPADEE@Z")]
回调函数:
//STRUCT
        [StructLayout(LayoutKind.Sequential)]
        public struct CARD_NUMBER_MSG
        {
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
            public byte[] ControllerIP;
            public uint CommandSeq;
            public uint ReaderID;
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
            public byte[] CardID;
            public string print()
            {
                return "CARD_NUMBER_MSG information : ControllerIP:" + String.Format("{0}.{1}.{2}.{3}", ControllerIP[0], ControllerIP[1], ControllerIP[2], ControllerIP[3]) + " CommandSeq:" + CommandSeq + " ReaderID:  " + ReaderID + " CardID " + String.Format("{0}|长度:{1}", CardID[0], CardID.Length);
            }
        }

public delegate void ReadedCardNumber(uint dwUser, ref CARD_NUMBER_M
SG p_card_msg);

[StructLayout(LayoutKind.Sequential)]
        public struct CALLBACK_FUN
        {
            public ReadedCardNumber p_ReadedCardNumberCallBack;
        }
 c++里面的设置回调函数的代码:
 /******************************************************************************************************
* Function Name : TCP102SetReceivedDataCallBack
* Description   : 设置回调
* Arguments     : None.
* Output        : None.
* Return        : None.
* Note(s)       : None.
*******************************************************************************************************/
TCP102_SDK_API unsigned char __stdcall TCP102_InitCallBack(DWORD dwUser,CALLBACK_FUN *p_call_back)
{
    if((NULL==p_call_back)||(0==dwUser))
    {
        return  TCP102_ERR_PARAMETER;
    }

    //设置回调函数指针
    ReadedCardNumberCallBack = p_call_back->p_ReadedCardNumberCallBack;
    h_CallBackWindow = dwUser;

    return TCP102_ERR_OK;
}

要实现的功能就是正确的初始化、设置回调函数...后,当sdk有读到卡片数据后,将读到的数据通过回调函数传递到c#这边来。
现在的问题是,第一次触发dll把读到的卡片信息回调到c#这边可以正确执行。但第二次就报未实例化对象的错误了。想知道有大神遇到过这样的问题吗?求解答。(目前调试的结果是还没触发回调方法就报未实例化对象的错了,在想是不是没找到回调方法的指针地址.)

  • 写回答

1条回答 默认 最新

  • threenewbee 2017-08-03 16:31
    关注

    你出现异常的代码是哪一行?有没有关闭读卡器或者重新初始化的代码没有调用?

    评论

报告相同问题?

悬赏问题

  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?