声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 2518|回复: 4

matlab的combuilder系列-matlab下做com组件

[复制链接]
发表于 2005-6-25 12:12 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

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

使用道具 举报

 楼主| 发表于 2005-6-25 12:12 | 显示全部楼层
matlab的combuilder系列-vb,c#.net调用<BR><BR><BR>这一部分讲vb,c#.net下怎么实现调用上一部分我们生成的comtest_1_0.dll(matlab下做的<BR>com组件),记得一定先要对mwcomutil.dll进行注册(怎么注册参看上一部分)<BR>1.vb下实现调用<BR>    打开或新建一个vb工程,点project-Reference,在弹出来的窗口中找到comtest 1.0 <BR>Type Library,将前面的复选框选上,点击ok,此时便将此com组件添加到工程里面去了,<BR>此时你可以用对象浏览器看到comtest下有个sgltest类,这个类里面有两个方法im_test,<BR>split2rgb,还有个MWFlags成员(这个成员是自动生成的),vb下测试代码如下:<BR>    测试im_test方法的代码:<BR>    Dim st As sgltest<BR>    Set st = New sgltest<BR>    Call st.im_test<BR>    测试split2rgb方法的代码:<BR>    Dim st As sgltest<BR>    Set st = New sgltest<BR>    Dim h As Variant, w As Variant, r As Variant, g As Variant, b As Variant, <BR>filename As Variant<BR>    filename = "c:\\1.jpg"<BR>    Call st.split2rgb(5, h, w, r, g, b, filename)  <BR>可见matlab下函数的输入输出参数在com组件里全是variant型的变量,测试大获成功,结<BR>果就跟matlab下运行的一摸一样,爽<BR><BR>2.c#.net下实现调用<BR>    打开或新建一个c#项目(我采用的是vs.net编辑器),选中右边的解决方案资源管理器<BR>中的引用,点鼠标右键,选添加引用,在弹出来的窗口中选com,然后也找到comtest_1_0<BR>.dll,点选择,然后确定就可,此时此com组件也添加到工程里面去了,同样我们可以选择<BR>对象浏览器来看comtest及下面的sgltest类,c#测试项目如下:<BR>    测试im_test方法的代码:<BR>    comtest.sgltestClass st=new comtest.sgltestClass();                        <BR>    st.im_test();<BR>    测试split2rgb方法的代码:<BR>    comtest.sgltestClass st=new comtest.sgltestClass();                        <BR>    object h=null,w=null,r=null,g=null,b=null;<BR>    object filename="c:\\1.jpg";<BR>    st.split2rgb(5,ref h,ref w,ref r,ref g,ref b,filename);<BR>可见输入参数是ref object型的,而输出参数是object型的,测试同样大获成功,与matl<BR>ab下运行的结果一摸一样,爽呆了。<BR>
 楼主| 发表于 2005-6-25 12:13 | 显示全部楼层
matlab的combuilder系列-vc下调用<BR><BR><BR>这一部分讲vc下实现调用第一部分我们生成的comtest_1_0.dll,同样要记得先对mwcomut<BR>il.dll进行注册(怎么注册参看第一部分),vb和.net下实现对com组件的调用很简单,而v<BR>c下实现这一步我可是摸索了好几天(主要是vc用的不好)<BR>1.先做一些准备工作,用ole viewer工具<BR>    开始--程序--Microsoft visual studio6.0--Microsoft visual studio6.0 Tools--<BR>OLE viewer(这个工具也可以通过在vc下点Tools--OLE/COM Object Viewer来打开,在Ole<BR>viewer工具里,在右边选择Type libraries,将他展开,找到comtest 1.0 Type Library<BR>,选中它,点鼠标右键,选view,便又弹出一窗口,点工具栏上的save按钮,分别将他保<BR>存为comtest_1_0.h,comtest_1_0.c(也可以存为comtest_1_0.Idl接口文件),我们就可以通<BR>过这两个文件实现对comtest_1_0.dll调用<BR><BR>2.vc下调用<BR>    新建或打开一个vc工程,注意,此时不用对编译器进行任何设置(而用mcc生成的dll我<BR>们么设置一大堆,我这儿只设置了Precomplied headers,选Automatic use of precomplied<BR>headers,写上 stdafx.h),将comtest_1_0.h和comtest_1_0.c加入工程,并复制<BR>一个comtest_1_0.dll到工程目录下,由于comtest_1_0.dll还要用到mwcomutil.dll,所<BR>以将&lt;matlabroot&gt;/extern/include/下的mwcomutil.h和mwcomtypes.h也加入工程<BR>(将这两个文件拷贝入工程路径下,如果设置了library path,可以不加)<BR>此时可以通过classView看到多出了_IID、IMWUtil,Isgltest类,Isgltest就是我们在mat<BR>lab下建起来的sgltest类<BR>vc下代码如下<BR>//这几个是引入dll和头文件<BR>#import "mwcomutil.dll"<BR>#import "comtest_1_0.DLL"<BR>#include "mwcomutil.h"<BR>#include "comtest_1_0.h"<BR>#include "comutil.h"       //此文件是用来处理由char *向VARIANT类型的转换<BR>测试im_test方法的代码:<BR>   if(FAILED(CoInitialize(NULL)))      //初始化调用com<BR>   {<BR>     AfxMessageBox("unable to initialize COM");<BR>   }<BR>   Isgltest *st=NULL;   <BR>   //创建一个com组件,CLSID_sgltest和IID_Isgltest可以从comtest_1_0.h和comtest_<BR>1_0.c里找到<BR>   HRESULT hr=CoCreateInstance(CLSID_sgltest,NULL,CLSCTX_ALL,IID_Isgltest,(voi<BR>d **)&amp;st);<BR>   if(SUCCEEDED(hr))<BR>   {<BR>       st-&gt;im_test(); <BR>       AfxMessageBox("succeed");<BR>           st-&gt;Release();<BR>   }<BR>   else<BR>   {<BR>       AfxMessageBox("unsucceed");<BR>   }    <BR>如果你的vc工程是console project的话,上述的AfxMessageBox可改成printf或cout,<BR>测试split2rgb方法的代码(类型转换我参照visual c的精华区也转换成功了)<BR>   if(FAILED(CoInitialize(NULL)))<BR>   {<BR>     AfxMessageBox("unable to initialize COM");<BR>   }<BR>   Isgltest *st=NULL;   <BR>   HRESULT hr=CoCreateInstance(CLSID_sgltest,NULL,CLSCTX_ALL,IID_Isgltest,(voi<BR>d **)&amp;st);<BR>   VARIANT m,n,r,g,b,filename;<BR>   VariantInit(&amp;m);<BR>   VariantInit(&amp;n);<BR>   VariantInit(&amp;r);<BR>   VariantInit(&amp;g);<BR>   VariantInit(&amp;b);<BR>   VariantInit(&amp;filename);<BR>   filename.vt=VT_BSTR;<BR>   filename.bstrVal=_com_util::ConvertStringToBSTR("C:\\1.jpg");<BR>   if(SUCCEEDED(hr))<BR>   {<BR>       st-&gt;split2rgb(5,&amp;m,&amp;n,&amp;r,&amp;g,&amp;b,filename);<BR>       st-&gt;Release();<BR>       AfxMessageBox("succeed");<BR>   }<BR>   else<BR>   {<BR><BR>       AfxMessageBox("unsucceed");<BR>   }    <BR>同样,运行结果与matlab下的结果一摸一样,记得我们的im_test里面可是使用了imshow阿<BR>,以前用mcc生成的程序中用它可是有错哦,爽呆了。<BR>关于VC下用com组件及其类型的转变请参看msdn及其Visual C的精华区<BR><BR><BR>----------------------------------------------<BR><FONT color=#dc143c>            公、诚、勇、毅</FONT><BR>西岳轩昂,北极辉煌;泽被万方,化育先翔;<BR>巍哉学府,焕乎文章;厚生教养,国乃盛强;<BR>千仞之墙,百炼之钢;镂木铄金,为工所长;<BR>公诚勇毅,永矢毋忘;光华灿烂,西工无疆!<BR><BR>
 楼主| 发表于 2005-6-25 12:13 | 显示全部楼层
matlab的combuilder系列-打包及其优缺点评注<BR><BR><BR>^_^,combuilder系列可以结尾了<BR>一.打包:<BR>    在matlab下的workspace里打comtool,点file-open project将我们先前建好的comte<BR>st.cbl工程文件打开,再点component--package component就实现了打包,此时到<BR>comtest\distrib文件夹里看,生成的comtest.exe就是打包后<BR>的解压程序,双击它会解压出一些文件,再点击解压出来的_install.bat就可以实现安装<BR>(按他的步骤去做就行了)<BR><BR>二.优缺点评注<BR>    这几天用这个combuilder可把我给爽死了,特别是在vc下调用成功时,记得精华区里<BR>曾讲combuilder没有什么实质性的突破,我可不这么认为,它的突破可大了<BR>    1.做出来的是com,通用的,任何编译器只要支持com,就可以实现调用,想c++ build<BR>er,Delphi等的,我想只要按照调用com组件去做,也能成功的<BR>    2.支持imshow等一些原来混编用不了的函数,对图形库的支持也比以前强(这些还需各<BR>位大侠共同测试)<BR>    3.实现方法简单,没有像以前混编还要设置一大堆东东<BR>    4.能够在matlab下写自己的类,并为自己的类编写成员、方法和事件,管理工程也方<BR>便(这个有点像vc、vb下管理工程一样)<BR>    用的太爽了,一下子还不知道怎么写缺点了,^0^,我想缺点还需大家一起用来找出<BR>    我这儿说一个缺点,感觉它的参数全是VARIANT型的,不怎么方便<BR>
发表于 2006-2-22 23:19 | 显示全部楼层

回复:(yejet)excel数学函数使用技巧--四舍五入

<P>看了yejet的帖子后,真是受益非浅,<BR>能不能谈谈在网页里如何调用matlab的com组件的经验呢?现在正困扰着我的问题,希望能得到yejet前辈的指点,谢谢!</P>
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-9-26 05:24 , Processed in 0.070567 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表