首页新闻找找看学习计划

c++ dll里的 struct里的回调函数C#如何调?

0
悬赏园豆:10 [已解决问题] 解决于 2015-06-30 18:41

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里找不到

jhlong的主页 jhlong | 初学一级 | 园豆:21
提问于:2015-06-30 15:44
< >
分享
最佳答案
0

typedef int  (WINAPI *PreviewCallback)(。。。);  // 。。。这是啥?

收获园豆:10
Launcher | 高人七级 |园豆:45040 | 2015-06-30 15:48

PreviewCallback   c++里定义的这么一个回调函数,。。。是参数,没必要贴出来

jhlong | 园豆:21 (初学一级) | 2015-06-30 15:51

@jhlong: 

x86 还是 x64?

字节对齐方式?

MarshalAs(UnmanagedType.FunctionPtr)

public MyPreviewDataCallback funcStreamCallback;

Launcher | 园豆:45040 (高人七级) | 2015-06-30 16:10

@Launcher: X86,这个应该跟字节对齐没关系吧

PreviewCallback这个函数是后台开一个线程不断接受视频帧然后返回来处理

jhlong | 园豆:21 (初学一级) | 2015-06-30 16:18

@jhlong: 我想问一句,PREVIEW_CHANNEL_INFO 这个结构体你不需要先传递给 C++ DLL 去注册你的回调函数吗?你能不能把完整的调用代码给贴出来?因为我实在是看不出,你的回调函数如何就能被 C++ DLL调用了?

Launcher | 园豆:45040 (高人七级) | 2015-06-30 16:21

@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

jhlong | 园豆:21 (初学一级) | 2015-06-30 16:26

@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 | 园豆:21 (初学一级) | 2015-06-30 16:30

@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 | 园豆:45040 (高人七级) | 2015-06-30 16:34

@Launcher: 嗯,多谢大神回答,我再研究研究吧

jhlong | 园豆:21 (初学一级) | 2015-06-30 16:40
其他回答(1)
0

发现是自己的struct写错了,感谢@Launcher回答,学了不少东西,

又遇上个新问题

 

把struct PREVIEW 作为回调函数的参数传进去,然后执行完回调函数,窗体直接关闭了,没有任何异常,类似这个帖子

http://bbs.csdn.net/topics/370134994 

jhlong | 园豆:21 (初学一级) | 2015-06-30 18:40
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册