基于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,然后在方法函数里添加打开图片的代码
注意要添加头文件#include “highgui.h”/,还有图片目录我使用的是相对目录,参见: (C++中相对路径与绝对路径以及斜杠与反斜杠的区别)/article/1989956.html ,这张图片自己随便找张就行,要与下文你创建的WinForm项目的Debug文件夹同目录,也就是在你生成的.exe的上一级目录里。
完成之后要点击生成解决方案,它不能运行。
2.当前解决方案下,新建一个WinForm程序,将其设为启动项,添加自建控件picture,并添加一个按钮控件,在按钮控件的响应消息里调用控件picture的OpenPictre方法。
运行结果:
![](http://img.blog.csdn.net/20151107212620248)
源码在这里:http://download.csdn.net/detail/nnnnnnnnnnnny/9251021
总体只是为了作个demo,改动代码很少。使用前请注意你opencv的配置
在开始之前需要了解其主要思想,*这里我首先新建一个基于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的配置
相关文章推荐
- C#—构造函数和析构函数
- 3.C#中的选择语句
- C#入门--索引器
- C# NSoup.dll 抓取网页信息
- C#第一节课
- 说说C#中IList与List区别
- C#入门--字段与属性
- c# socket传输struct类型
- C#删除WebBrowser控件Session
- C#语法之函数
- VS 通过 附加进程的方式来调试 C#服务程序
- c#语句
- c#正则表达式--环视
- C#实现图片文件到数据流再到图片文件的转换 --转
- C# 给PDF文件添加水印
- C#状态模式——解决方法过长问题
- 揭开你的面纱----C#.net初识
- C# ListBox 控件
- c# combobox属性dropdownlist赋值
- (转自博客园-雲霏霏)5天玩转C#并行和多线程编程 —— 第三天 认识和使用Task