c++
struct
typedef struct _PREVIEW_CHANNEL_INFO
{
DWORD dwID;
PreviewDataCallback funcStreamCallback;
}PREVIEW;
定义
typedef int (WINAPI *PreviewDataCallback)(。。。);
C#
[StructLayout(LayoutKind.Sequential)]
public struct PREVIEW_CHANNEL_INFO
{
public uint dwID;
public MyPreviewDataCallback funcStreamCallback;
};
public delegate int MyPreviewDataCallback(。。。); //声明委托
然后_PREVIEW.PreviewDataCallback= new MyPreviewCallback(PreviewCallbackFunc);
public static int PreviewDataCallbackFunc(。。。)
{
}
这样的话回调函数似乎没反映,怎么办
跟其他的函数传参数还不太一样似乎,这是建个struct传参数,PreviewDataCallback函数在dllexport里找不到
typedef int (WINAPI *PreviewCallback)(。。。); // 。。。这是啥?
PreviewCallback c++里定义的这么一个回调函数,。。。是参数,没必要贴出来
@jhlong:
x86 还是 x64?
字节对齐方式?
MarshalAs(UnmanagedType.FunctionPtr)
public MyPreviewDataCallback funcStreamCallback;
@Launcher: X86,这个应该跟字节对齐没关系吧
PreviewCallback这个函数是后台开一个线程不断接受视频帧然后返回来处理
@jhlong: 我想问一句,PREVIEW_CHANNEL_INFO 这个结构体你不需要先传递给 C++ DLL 去注册你的回调函数吗?你能不能把完整的调用代码给贴出来?因为我实在是看不出,你的回调函数如何就能被 C++ DLL调用了?
@Launcher: PREVIEW_CHANNEL_INFO结构体如何传递给 C++ DLL 去注册?
完整代码应该就是贴出来的这些,我也不知道怎么做啊
PREVIEW_CHANNEL_INFO openinfo;
openinfo.dwID = cid;
openinfo.PreviewCallback = new MyPreviewCallback(PreviewCallbackFunc);
OpenPreviewChn(txtIP.Text, uint.Parse(txtPort.Text), ref openinfo, out chanelPtr, 。。。更多参数);
openinfo是另一个调用C++ dll函数OpenPreviewChn的参数,从这里传给c++ dll
@Launcher: C++直接这样调用的
PREVIEW_CHANNEL_INFO_EX openInfo;
memset(&openInfo,0,sizeof(PREVIEW_CHANNEL_INFO));
openInfo.funcStreamCallback = PreviewDataCallback;
ERR_MSG herr = ERR_SUCCESS;
herr = OpenPreviewChn(m_deviceip.GetBuffer(0), m_deviceport, (PREVIEW_CHANNEL_INFO *)&openInfo, 。。。);
@jhlong:
OpenPreviewChn(txtIP.Text, uint.Parse(txtPort.Text), ref openinfo, out chanelPtr, 。。。更多参数);
注意第三个参数 ref openinfo,这就是注册回调函数(为什么呢?因为 openinfo 的类型是 PREVIEW_CHANNEL_INFO,而 PREVIEW_CHANNEL_INFO 包含回调函数,虽然我不知道你写的啥代码,或者啥功能,我只是从类型上来推断函数功能)。
注册后,你需要在整个运行期间保持 openinfo 有效,我猜测应该还有个 ClosePrevewChn 方法,此方法可能根据 dwID 参数去取消已经注册的 funcStreamCallback 回调函数。
因为对方 C++ 为 x86,你需要将你的程序编译为 x86,以避免不可预知的错误。
@Launcher: 嗯,多谢大神回答,我再研究研究吧
发现是自己的struct写错了,感谢@Launcher回答,学了不少东西,
又遇上个新问题
把struct PREVIEW 作为回调函数的参数传进去,然后执行完回调函数,窗体直接关闭了,没有任何异常,类似这个帖子
http://bbs.csdn.net/topics/370134994