基于Activex控件的C++、C#混合编程

最近做一个东西,需要用C#做界面,C++和OpenCV做算法部分。就大致了解了一下C#和C++混合编程的方法,刚开始选择使用动态链接库DLL来实现,比较麻烦,最终也没有成功实现。后来尝试使用ActiveX控件来作为C++和C#的桥梁,实现过程比较方便,现记录如下。
在开始之前需要了解其主要思想,*这里我首先新建一个基于MFC的Activex控件的工程,把自己要用C++实现的算法融合进来。然后在C#项目(我用的是Winform编程)中直接添加此控件,再通过调用控件的属性、消息或方法(我使用的主要是方法)等接口从而调用了C++所实现的算法。*OK,下面说一下具体的实现方法。
第一步,学习简单的基于MFC的ActiveX控件的开发。
网址:(基于MFC的ActiveX控件开发)http://iysm.net/?p=114 这个介绍的特别详细,需要说明一下的是文章所说的“ActiveX控件测试容器”在VS2010里边已经不能直接找到了,好像在某个文件夹里,大家自行百度一下吧,或再下载一个。还有其中重点关注的就是自定义方法啦,我基本上就是用这种方式作接口。
也可以看这个比较简单的:(VC2005从开发MFC ActiveX ocx控件到发布到.net网站的全部过程)http://www.cnblogs.com/gengaixue/archive/2010/08/13/1799112.html 只看一二部分即可。

还有MSDN上的介绍:https://msdn.microsoft.com/zh-cn/library/552z1tz3.aspx ,毕竟是权威,有不懂的可以查一下。
第二步,就是需要在WinForm项目中添加自己制作的控件,具体方法:
在WinForm环境下,工具箱窗口右键——>选择项——>COM组件,找到自己新作的控件,左侧打对勾,确定。
第三步,实际应用
此应用中,我利用opcv来打开一张图片,然后再WinForm里调用它。
1.新建一个基于MFC的ActiveX控件项目,添加方法OpenPicture,然后在方法函数里添加打开图片的代码

void CpictureCtrl::OpenPicture(void)
{
    AFX_MANAGE_STATE(AfxGetStaticModuleState());

    // TODO: 在此添加调度处理程序代码
    IplImage* img = cvLoadImage("..//pic.jpg");//加载图像至文件,执行完返回一个指向IplImage类型的指针
    cvNamedWindow("Example1", CV_WINDOW_AUTOSIZE);//在屏幕上创建一个标题为“Example1”的窗口
    cvShowImage("Example1", img);//在“Example1”窗口中显示img指针所指的图像

    cvWaitKey(0);//等待(暂停)函数。“0或负数”——一直等待用户触发按键
    cvReleaseImage(&img);//释放为该图像文件所分配的内存
    cvDestroyWindow("Example1");//销毁显示图像文件的窗口,同时释放为该窗口所分配的所有内存

}

注意要添加头文件#include “highgui.h”/,还有图片目录我使用的是相对目录,参见: (C++中相对路径与绝对路径以及斜杠与反斜杠的区别)http://blog.csdn.net/sszgg2006/article/details/8447176 ,这张图片自己随便找张就行,要与下文你创建的WinForm项目的Debug文件夹同目录,也就是在你生成的.exe的上一级目录里。
完成之后要点击生成解决方案,它不能运行。
2.当前解决方案下,新建一个WinForm程序,将其设为启动项,添加自建控件picture,并添加一个按钮控件,在按钮控件的响应消息里调用控件picture的OpenPictre方法。

private void button1_Click(object sender, EventArgs e)
{
     axpicture1.OpenPicture();
}

运行结果:
这里写图片描述
源码在这里:http://download.csdn.net/detail/nnnnnnnnnnnny/9251021
总体只是为了作个demo,改动代码很少。使用前请注意你opencv的配置

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值