声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 1583|回复: 6

[混合编程] 使用matlab6.5生成COM组件问题

[复制链接]
发表于 2007-1-21 17:40 | 显示全部楼层 |阅读模式

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

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

x
各位高手,小弟想用matlab6.5进行与VC6.0混合编程,但怎么也不能生成COM组件,我按照论坛的帖子设置了
mbuild -setup、mex -setup和环境变量,但还是不成功,老是出现  MBUILD.BAT: Error: IDL compile of 'D:/MATLAB6p5/work/ffttest/src/ffttest_idl.idl' failed.
请各位大虾看看怎么解决阿?

还有我用mbuild -setup和mex -setup是出现下面结果,不知道是不是影响最后不能成功生成COM的主要原因

>> mbuild -setup
Please choose your compiler for building standalone MATLAB applications:

Would you like mbuild to locate installed compilers [y]/n? y

Select a compiler:
[1] Lcc C version 2.4 in D:\MATLAB6P5\sys\lcc
[2] Microsoft Visual C/C++ version 6.0 in D:

[0] None

Compiler: 2

Please verify your choices:

Compiler: Microsoft Visual C/C++ 6.0
Location: D:

Are these correct?([y]/n): y

The default options file:
"C:\Documents and Settings\Administrator\Application Data\MathWorks\MATLAB\R13\compopts.bat"
is being updated from D:\MATLAB6P5\BIN\WIN32\mbuildopts\msvc60compp.bat...


--> "D:\MATLAB6p5\bin\win32\mwregsvr D:\MATLAB6p5\bin\win32\mwcomutil.dll"

DllRegisterServer in D:\MATLAB6p5\bin\win32\mwcomutil.dll succeeded

--> "D:\MATLAB6p5\bin\win32\mwregsvr D:\MATLAB6p5\bin\win32\mwcommgr.dll"

DllRegisterServer in D:\MATLAB6p5\bin\win32\mwcommgr.dll succeeded

Installing the MATLAB Visual Studio add-in ...

  Warning: Could not update D:\common\msdev98\template\MATLABWizard.awx
    from D:\MATLAB6P5\BIN\WIN32\MATLABWizard.awx
  Warning: Could not update D:\common\msdev98\template\MATLABWizard.hlp
    from D:\MATLAB6P5\BIN\WIN32\MATLABWizard.hlp
  Warning: Could not update D:\common\msdev98\addins\MATLABAddin.dll
    from D:\MATLAB6P5\BIN\WIN32\MATLABAddin.dll
  Warning: Could not update D:\common\msdev98\bin\usertype.dat
    from D:\MATLAB6P5\BIN\WIN32\usertype.dat

  Note: One or more components necessary to the operation of the MATLAB Visual
        Studio add-in could not be installed. The MATLAB Visual Studio add-in
        will not be available, but the rest of this setup operation will  
        continue normally.

>> mex -setup
Please choose your compiler for building external interface (MEX) files:

Would you like mex to locate installed compilers [y]/n? y

Select a compiler:
[1] Lcc C version 2.4 in D:\MATLAB6P5\sys\lcc
[2] Microsoft Visual C/C++ version 6.0 in D:

[0] None

Compiler: 2

Please verify your choices:

Compiler: Microsoft Visual C/C++ 6.0
Location: D:

Are these correct?([y]/n): y

The default options file:
"C:\Documents and Settings\Administrator\Application Data\MathWorks\MATLAB\R13\mexopts.bat"
is being updated from D:\MATLAB6P5\BIN\WIN32\mexopts\msvc60opts.bat...

Installing the MATLAB Visual Studio add-in ...

  Warning: Could not update D:\common\msdev98\template\MATLABWizard.awx
    from D:\MATLAB6P5\BIN\WIN32\MATLABWizard.awx
  Warning: Could not update D:\common\msdev98\template\MATLABWizard.hlp
    from D:\MATLAB6P5\BIN\WIN32\MATLABWizard.hlp
  Warning: Could not update D:\common\msdev98\addins\MATLABAddin.dll
    from D:\MATLAB6P5\BIN\WIN32\MATLABAddin.dll
  Warning: Could not update D:\common\msdev98\bin\usertype.dat
    from D:\MATLAB6P5\BIN\WIN32\usertype.dat

  Note: One or more components necessary to the operation of the MATLAB Visual
        Studio add-in could not be installed. The MATLAB Visual Studio add-in
        will not be available, but the rest of this setup operation will  
        continue normally.
回复
分享到:

使用道具 举报

 楼主| 发表于 2007-1-21 18:26 | 显示全部楼层
哪位大哥知道啊?
告知一声啊!
发表于 2007-1-21 18:37 | 显示全部楼层

回复

这个你只能按提示找错误了.
或者你发短消息给原作者询问一下.
发表于 2007-1-21 18:47 | 显示全部楼层
你再搜索一下论坛,看看是否有其它相关的帖子.
下面我再转一个简单的示例帖,你自己看看:
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
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);

2.c#.net下实现调用
    打开或新建一个c#项目(我采用的是vs.net编辑器),选中右边的解决方案资源管理器中的引用,点鼠标右键,选添加引用,在弹出来的窗口中选com,然后也找到comtest_1_0.dll,点选择,然后确定就可,此时此com组件也添加到工程里面去了,同样我们可以选择对象浏览器来看comtest及下面的sgltest类,c#测试项目如下:
    测试im_test方法的代码:
    comtest.sgltestClass st=new comtest.sgltestClass();      
    st.im_test();
    测试split2rgb方法的代码:
    comtest.sgltestClass st=new comtest.sgltestClass();      
    object h=null,w=null,r=null,g=null,b=null;
    object filename="c:\\1.jpg";
    st.split2rgb(5,ref h,ref w,ref r,ref g,ref b,filename);
可见输入参数是ref object型的,而输出参数是object型的,测试同样大获成功,与matlab下运行的结果一模一样.
发表于 2007-1-21 18:51 | 显示全部楼层
再提供一种通过Idl或dll来调用com组件的方法(不用生成*.h和*.c文件)
其实这种方法比通过生成.h和.c文件来调用要简单一些:).
1.通过ole/com object生成idl文件,将此idl文件加入工程,点菜单build-complie comtest_1_0.tlb,生成tlb文件
2.打开classwizard,点右边的add class-from a type library class,选中刚生成的comtest_1_0.tlb(应该在debug\目录下),其实这儿也可以直接选择用matlab的combuilder 生成的comtest_1_0.dll(这样就省去了第一步),后面将出现生成class的一些对话框,照提示去做就可以了,这样就生成了comtest_1_0.h和comtest_1_0.cpp,多了一个Isgltest 类:)
3.测试代码如下:
头文件中只需添加:
#include "comtest_1_0.h"
测试代码:
   Isgltest st;
   AfxOleInit();
   if(st.CreateDispatch(_T("comtest.sgltest")))
      {
         st.im_test();     
         AfxMessageBox("Haha,Succeeded");
         st.ReleaseDispatch();
      }
   else
         AfxMessageBox("UnSucceeded");

[ 本帖最后由 xjzuo 于 2007-1-21 18:53 编辑 ]
 楼主| 发表于 2007-1-23 12:19 | 显示全部楼层
感谢楼上的,问题解决了!
发表于 2007-3-19 16:56 | 显示全部楼层

 

请问楼主是如何解决的呢?我也碰到了这个问题
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

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

GMT+8, 2024-11-12 13:18 , Processed in 0.058764 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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