VC调用matlab生成的COM组件

1. 设置编译器。在MATLAB命令窗口里敲:>>mbuild –setup,完成编译器的设置。

2. 编写M函数文件.
如:

3. 在命令窗口敲:>>comtool,出现com组件builder。选择FILE选项->New Project选项。出现以下界面。 

Component name选项:设置com组件的名称,注意不要和上面添加的m文件重名。 
Class name选项:设置类名称MyArraytest。一般将鼠标点击空白位置,系统会自动生成类名。 
Project version选项:版本号。系统默认为1.0,将来要修改或添加其他函数时,可以修改此选项为2.0,3.0等。 
Project directory选项:工程所在目录。 
Complier options选项:编译器配置选项,全部选中。 
最后单击OK。系统会出现对话框,问你是否创立工程目录,你选YES。 

4. 单击Project Files->plotclass->M-files,然后选中comtool菜单Project->Add File选项,添加上面写好的plot_test M函数,当然,可以按需要添加更多的M或MEX函数。

5. 单击Build按钮,选中Com Object选项,这时com-builder会帮你自动编译连接该组件,生成所需要的头文件,源文件,接口描述文件,动态连接库文件,等等。在右侧Build Status显示框里给出了编译的过程和信息。在菜单Component->Component Info里有关于接口、类、库的信息。在..\work\xxcom文件夹里,出现了两个子文件夹,distrib和src,这是我们VC中需要用到的文件、库、资源、接口等。在src\xxcom_idl_i.c中,有关于com类和com接口的GUID。其中CLSID(类的GUID)在VC编程中需要用到。别急,还有一步打包发布。选择Component->Package Component,系统就会自己帮你打包了。打包文件在distrib文件夹中有xxcom可执行文件。拷贝..\work\xxcom文件夹下所有文件,在另外一个机器上,双击xxcom可执行程序,注册com组件,。你的程序,就可以在其他机器上执行了。 

6. 打开VC++编译器,选择文件->新建->工程->MFC(exe)->命名(Test01)-对话框->完成)。 

7. 打开类向导,在 Add Class选项内,选中From a typed library,进入..\xxcom\src文件夹,选中xxcom_idl.tlb文件,点击打开,OK。这时一个COM类便加入进来了,查看一下为Icxx类。 

9. 下面就是OLE调用的基本方法了。首先在 CTest01App类的InitInstance()里添加初始化OLE代码。

BOOL suc = AfxOleInit(); // 初始化OLE
 if (suc==FALSE)
 {
  ::AfxMessageBox("初始化OLE失败!");
  return FALSE;
 }
……
其次,在 CTest01Dlg.h里包含xxcom_idl.h头文件;并从..\xxcom\src\xxcom_idl_i.c中拷贝类的GUID并复制到CTest01Dlg.h文件类定义的上面。
#include "xxcom_idl.h"
/////////////////////////////////////////////////////////////////////////////
// CTest01Dlg dialog
const CLSID CLSID_cxx = {0x37C14FC3,0x7B1A,0x4711,{0xA2,0x99,0x48,0x29,0x7B,0xA5,0x6D,0xE1}};
class CTest01Dlg : public CDialog
{
public:
 Icxx m_pRsp;
// Construction
public:
 CTest01Dlg(CWnd* pParent = NULL); // standard constructor
……
然后,就是调用了~
void CTest01Dlg::OnBtnRsp() 
{
 m_pRsp.CreateDispatch(CLSID_cxx,NULL); //创立接口
 COleDispatchDriver(); //连接(此句可以不写)
 VARIANT x;
 VARIANT y;
 VARIANT s;
 VariantInit(&x); //初始化
 VariantInit(&y);
 VariantInit(&s);
 x.vt = VT_R8; //类型(双精度型)
 y.vt = VT_R8;
 s.vt = VT_R8;
 //数组传递数据
 x.dblVal=3.2;
 y.dblVal=3.2;
 s.dblVal=0.0;
 LONG para = 1;
 //调用方法
 m_pRsp.add(para,&s,x,y);/*输出参数的个数*/
 // ::AfxMessageBox("调用结束!");
 m_pRsp.DetachDispatch();
 m_pRsp.ReleaseDispatch();
 
}