积极答复者
急救,error C2664: 调用以前的回调函数,按照MSDN加了委托也不行啊!

问题
-
我调用以前VC6写的DLL中的CALLBACK,按照MSDN上做法如下<input id="a67dec41-4cdd-4c46-a107-3cb74eb0a4c4_attachments" type="hidden" />
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 *)”
答案
-
你好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
-
上贴为准确回复帖子!
还有种方法我也写出希望给需要帮助的人,也同时感谢帮助我的人
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
全部回复
-
你好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
-
你好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 的作用范围不是很清楚。
我也有自己的签名档哦! -
上贴为准确回复帖子!
还有种方法我也写出希望给需要帮助的人,也同时感谢帮助我的人
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