matlab的combuilder系列-matlab下做com组件
com builder是matlab6.5才有的,也是mathworks公司推荐使用于混合编程的,这些日子我对他进行了全方位的摸索,感觉是爽呆了,下面我们一起来揭开它的神秘面纱,^_^。
此系列分为以下几块:
1.matlab下做com组件
2.vb,c#.net实现调用
3.vc实现调用
4.打包
5.优缺点评注
其中2,3部分可以选择一个看
有什么问题请发到邮箱: dkf03@mails.tsinghua.edu.cn,也可以上smth,ID:xxhn,bbfrog
后期补充:
6.vc中的数组和com中的VARIANT变量的相互转换(By capriccio)
7.vb,.net中的数组和com中的VARIANT变量的相互转换
8. Matlab与VC混合编程 (用idl或dll来调用com组件)
9.combuilder与vc混编中复数类型的输出(By LPCTSTR)
一.matlab下做com组件
com是component object module的简称,它是一种通用的对象接口,任何语言只要按照这种接口标准,就可以实现
调用它。matlab6.5新推出来的combuilder就是把matlab下的程序做成com组件,供其他语言调用。
我们先准备两个测试文件,并copy一个图片到c盘下,起名叫1.jpg(这些你都可以改的,我这儿是为了程序方便)
第一个叫im_test.m如下:
function im_test %这个文件不带输入与输出
I=imread('c:/1.jpg'); %因为以前带有imshow的程序用mcc编成dll后用%不了,所以想试combuilder是否
imshow(I); %能支持这些函数
第二个叫split2rgb.m,就是前些日子Zosco发给我的那个程序,因为它用mcc编成dll后有问题,所以我在这儿继续将它进行测试,而且它也带有多个输入及输出参数,所以也正好拿来测试
在matlab的workspace下打comtool,就打开了matlab com builder,点击file-new project,新建一个工程,在component name里填上comtest,Class name里填上一个sgltest(并将自动生成classes里的comtest remove掉),complie
code in选c或c++都无所谓,将Complier options里的Use Handle Graphics library的复选框画上,点击ok就行了。然后点击project--Add files,将im_test.m和split2rgb.m添加入工程,然后点Build-Com Object,就会在comtest/distrib/文件夹下生成一个comtest_1_0.dll(它就是做好的com组件),Build时matlab已经自动将此dll在注
册表中注册,为了下面能用其他编译器调用,我们还需做一个准备工作,开一个dos窗口,进入<matlabroot>/bin/win32目录下(matlabroot为你机器上matlab安装的路径),打regsvr32 mwcomutil.dll,即对mwcomutil.dll进行注册(这个dll是matlab下作的任何com组件都要用到的dll),下面我们在其他编译器下调用时就可以用了。
^_^,是不是觉得做起com组件来很简单呢,matlab下可以给com组件中的类添加成员、事件、方法等,我这儿其
实是给类sgltest添加了两个方法,怎么添加成员和方法可以参看matlab的com builder的帮助。
附录:split2rgb.m的源代码
%%// 测试文件
function [m_nHeight,m_nWidth,mOrigR,mOrigG,mOrigB]=Split2RGB(FileName)
%%// 读入一个Jpg文件,
mOrigData=imread(FileName);
%mDestData=imresize(mOrigData,0.5);
imwrite(mOrigData,'c:/2.jpg');
%%// 用三个变量保存其R,G,B分量
mOrigR=mOrigData(:,:,1);
mOrigG=mOrigData(:,:,2);
mOrigB=mOrigData(:,:,3);
%%// 获得图象的高度,宽度
[m_nHeight,m_nWidth]=size(mOrigR);
figure(1);
set(gcf,'MenuBar','none')
imshow(mOrigData);
title(['Orginal Image:',FileName],'Color','b','FontSize',14);
xlabel(['Height: ',num2str(m_nHeight),' Width :',num2str(m_nWidth)],'Color','b','FontSize',12);
%%// 写param文件
paraFName=[FileName(1:length(FileName)-4),'.param'];
fid=fopen(paraFName,'w');
fwrite(fid,m_nHeight,'uint32');
fwrite(fid,m_nWidth,'uint32');
fclose(fid);
%%// 写 R 分量文件
RFName=[FileName(1:length(FileName)-4),'_R.rot'];
fid=fopen(RFName,'w');
fwrite(fid,mOrigR,'uint8');
fclose(fid);
%%// 写 G 分量文件
GFName=[FileName(1:length(FileName)-4),'_G.rot'];
fid=fopen(GFName,'w');
fwrite(fid,mOrigG,'uint8');
fclose(fid);
%%// 写 B 分量文件
BFName=[FileName(1:length(FileName)-4),'_B.rot'];
fid=fopen(BFName,'w');
fwrite(fid,mOrigB,'uint8');
fclose(fid);
二.vb,c#.net实现调用
这一部分讲vb,c#.net下怎么实现调用上一部分我们生成的comtest_1_0.dll(matlab下做的com组件),记得一定先要对mwcomutil.dll进行注册(怎么注册参看上一部分)
1.vb下实现调用
打开或新建一个vb工程,点project-Reference,在弹出来的窗口中找到comtest 1.0 Type Library,将前面的复选框选上,点击ok,此时便将此com组件添加到工程里面去了,此时你可以用对象浏览器看到comtest下有个sgltest类,这个类里面有两个方法im_test,split2rgb,还有个MWFlags成员(这个成员是自动生成的),vb下测试代码如下:
测试im_test方法的代码:
Dim st As sgltest
Set st = New sgltest
Call st.im_test