您的位置:首页 > 编程语言 > C#

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

2015-10-29 21:07 351 查看
最近做一个东西,需要用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网站的全部过程)/content/4065385.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++中相对路径与绝对路径以及斜杠与反斜杠的区别)/article/1989956.html ,这张图片自己随便找张就行,要与下文你创建的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的配置
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: