none
急救,error C2664: 调用以前的回调函数,按照MSDN加了委托也不行啊! RRS feed

  • 问题

  • 我调用以前VC6写的DLL中的CALLBACK,按照MSDN上做法如下
    delegate void MyRealDataCallBack(参数);//委托

    ::jiankong::Frm_juzheng ^ MyFrm_junzheng = gcnew ::jiankong::Frm_juzheng; 
    MyRealDataCallBack^ f=gcnew MyRealDataCallBack(&jiankong::Frm_juzheng::RealDataCallBack); 
    m_lPlayHandle = NET_DVR_RealPlay_V30(lUserID, &struPlayInfo,f,NULL, bPreviewBlock);

    static void CALLBACK RealDataCallBack(参数){todo}

    编译无法通过啊!出错信息如下

    error C2664: “NET_DVR_RealPlay_V30”: 不能将参数 3 从“jiankong::MyRealDataCallBack ^”转换为“void (__stdcall *)(LONG,DWORD,BYTE *,DWORD,void *)”
    <input id="a67dec41-4cdd-4c46-a107-3cb74eb0a4c4_attachments" type="hidden" />
    2011年11月15日 4:20

答案

  • 你好xulezhong,

    这个错误是由参数类型不匹配引起的。
    函数NET_DVR_RealPlay_V30是在native编写的,它的第三个参数是函数指针。在C++/CLI中被调用时,传入的是MyRealDataCallBack^ 类型。

    可以通过下面的步骤在C++/CLI中实现回调函数:
    1-】在C++/CLI中创建托管回调函数。

    public delegate void  MyRealDataCallBack(参数);
    

    2-】导入NET_DVR_RealPlay_V30函数。注意转换第三个参数类型

    long NET_DVR_RealPlay_V30(参数1, 参数2, MyRealDataCallBack^ f, 参数3, 参数4);
    

    3-】创建一个委托。

    MyRealDataCallBack^ f=gcnew  MyRealDataCallBack(MyFrm_junzheng,&jiankong::Frm_juzheng::RealDataCallBack); 
    

    4-】调用NET_DVR_RealPlay_V30函数。

    m_lPlayHandle = NET_DVR_RealPlay_V30(lUserID, &struPlayInfo,f,NULL, bPreviewBlock);
    
    


    希望对你有所帮助。

    Helen


    Helen Zhao [MSFT]
    MSDN Community Support | Feedback to us
    • 已建议为答案 Helen Zhao 2011年11月21日 3:03
    • 已标记为答案 Helen Zhao 2011年11月22日 3:11
    2011年11月17日 8:17
  • 上贴为准确回复帖子!

    还有种方法我也写出希望给需要帮助的人,也同时感谢帮助我的人

     REALDATACALLBACK 为.h定义的typedef

    public delegate void  MyRealDataCallBack(LONG lRealHandle, DWORD dwDataType, BYTE *pBuffer, DWORD dwBufSize, void *pUser); //这个不变

      ::jiankong::Frm_juzheng ^ MyFrm_junzheng = gcnew ::jiankong::Frm_juzheng();
      MyRealDataCallBack^ fp=gcnew  MyRealDataCallBack(MyFrm_junzheng,&jiankong::Frm_juzheng::RealDataCallBack);
            GCHandle gch = GCHandle::Alloc(fp);
      IntPtr ip = Marshal::GetFunctionPointerForDelegate(fp);
      REALDATACALLBACK cb = static_cast<REALDATACALLBACK>(ip.ToPointer());
      m_lPlayHandle = NET_DVR_RealPlay_V30(lUserID, &struPlayInfo,cb,NULL, bPreviewBlock);

     


    • 已编辑 xulezhong 2011年11月20日 6:49
    • 已建议为答案 Helen Zhao 2011年11月21日 3:03
    • 已标记为答案 Helen Zhao 2011年11月22日 3:11
    2011年11月20日 3:09

全部回复

  • 你好xulezhong,

    这个错误是由参数类型不匹配引起的。
    函数NET_DVR_RealPlay_V30是在native编写的,它的第三个参数是函数指针。在C++/CLI中被调用时,传入的是MyRealDataCallBack^ 类型。

    可以通过下面的步骤在C++/CLI中实现回调函数:
    1-】在C++/CLI中创建托管回调函数。

    public delegate void  MyRealDataCallBack(参数);
    

    2-】导入NET_DVR_RealPlay_V30函数。注意转换第三个参数类型

    long NET_DVR_RealPlay_V30(参数1, 参数2, MyRealDataCallBack^ f, 参数3, 参数4);
    

    3-】创建一个委托。

    MyRealDataCallBack^ f=gcnew  MyRealDataCallBack(MyFrm_junzheng,&jiankong::Frm_juzheng::RealDataCallBack); 
    

    4-】调用NET_DVR_RealPlay_V30函数。

    m_lPlayHandle = NET_DVR_RealPlay_V30(lUserID, &struPlayInfo,f,NULL, bPreviewBlock);
    
    


    希望对你有所帮助。

    Helen


    Helen Zhao [MSFT]
    MSDN Community Support | Feedback to us
    • 已建议为答案 Helen Zhao 2011年11月21日 3:03
    • 已标记为答案 Helen Zhao 2011年11月22日 3:11
    2011年11月17日 8:17
  • 你好xulezhong,

    这个错误是由参数类型不匹配引起的。
    函数NET_DVR_RealPlay_V30是在native编写的,它的第三个参数是函数指针。在C++/CLI中被调用时,传入的是MyRealDataCallBack^ 类型。

    可以通过下面的步骤在C++/CLI中实现回调函数:
    1-】在C++/CLI中创建托管回调函数。

    public delegate void  MyRealDataCallBack(参数);
    

    2-】导入NET_DVR_RealPlay_V30函数。注意转换第三个参数类型

    long NET_DVR_RealPlay_V30(参数1, 参数2, MyRealDataCallBack^ f, 参数3, 参数4);
    

    3-】创建一个委托。

    MyRealDataCallBack^ f=gcnew  MyRealDataCallBack(MyFrm_junzheng,&jiankong::Frm_juzheng::RealDataCallBack); 
    

    4-】调用NET_DVR_RealPlay_V30函数。

    m_lPlayHandle = NET_DVR_RealPlay_V30(lUserID, &struPlayInfo,f,NULL, bPreviewBlock);
    
    


    希望对你有所帮助。

    Helen


    Helen Zhao [MSFT]
    MSDN Community Support | Feedback to us

    请教一下,在创建后,使用前需要明确钉住吗?因为我对pin_ptr 的作用范围不是很清楚。
    我也有自己的签名档哦!
    2011年11月17日 8:27
  • 上贴为准确回复帖子!

    还有种方法我也写出希望给需要帮助的人,也同时感谢帮助我的人

     REALDATACALLBACK 为.h定义的typedef

    public delegate void  MyRealDataCallBack(LONG lRealHandle, DWORD dwDataType, BYTE *pBuffer, DWORD dwBufSize, void *pUser); //这个不变

      ::jiankong::Frm_juzheng ^ MyFrm_junzheng = gcnew ::jiankong::Frm_juzheng();
      MyRealDataCallBack^ fp=gcnew  MyRealDataCallBack(MyFrm_junzheng,&jiankong::Frm_juzheng::RealDataCallBack);
            GCHandle gch = GCHandle::Alloc(fp);
      IntPtr ip = Marshal::GetFunctionPointerForDelegate(fp);
      REALDATACALLBACK cb = static_cast<REALDATACALLBACK>(ip.ToPointer());
      m_lPlayHandle = NET_DVR_RealPlay_V30(lUserID, &struPlayInfo,cb,NULL, bPreviewBlock);

     


    • 已编辑 xulezhong 2011年11月20日 6:49
    • 已建议为答案 Helen Zhao 2011年11月21日 3:03
    • 已标记为答案 Helen Zhao 2011年11月22日 3:11
    2011年11月20日 3:09