1.生成 guitest1.m 文件函数
function guitest1( ctrl1 ) x=-1:0.01:1; y=x.^2; switch ctrl1 case 0 %产生一个名为“_guitest1_”的不可见窗口 figure('NumberTitle','Off','Name','_guitest1_','Visible','Off'); case 1 %将figure设置为可见 h=gcf; % gcf返回当前Figure对象的句柄值 set(h,'Visible','On'); end plot(x,y,'r'); end
2.编译,注意:在MATLAB环境执行时,VS不能是运行的。ui
mcc -W cpplib:GuiTestLib -T link:lib guitest1 -C //不加 -C 不会生成 GuiTestLib.ctf文件
3.新建项目,MFC项目引入外部库文件目录设置等spa
// C/C++附加包含目录: D:\MATLAB2016a\extern\include // 连接器--常规--附加库目录 D:\MATLAB2016a\extern\lib\win64\microsoft // 连接器--输入--附加依赖项((中间必须是回车分开,回车之后自动生成分号,不是空格键,也不是手动添加分号) mclmcrrt.lib libmx.lib libmat.lib mclmcr.lib libmex.lib GuiTestLib.lib
4.将生成的.dll,.h,.ctf,.lib四个文件拷贝到vs项目下(生成.exe后还须要将dll拷贝到exe所在文件夹下)。MFC项目中加入 code
#include "mclmcr.h"
#include "matrix.h"
#include "mclcppclass.h"
#include "myaddtestlib.h" 。在项目中调用MATLAB生成的函数时,注意查看.h文件中函数声明(在最后一行)。orm
5.MFC添加名为 IDC_PLOTAREA 的图片控件,并添加一个按钮以及设置相应函数:对象
void CmatcomDlg::OnBnClickedButton1() { //调用Matlab产生的COM组件时,须要将VC中的参数转换为mwArray格式 static double gui_hid = 0; static double gui_show = 1; // 为变量分配内存空间,能够查帮助mwArray // 1,1表示矩阵的大小(mxDOUBLE_CLASS表示变量的精度) static mwArray mw_hid(1, 1, mxDOUBLE_CLASS); static mwArray mw_show(1, 1, mxDOUBLE_CLASS); mw_hid.SetData(&gui_hid, 1); mw_show.SetData(&gui_show, 1); // 调用COM组件产生一个不可见Figure窗口 //dll对应的.h头文件最后关于guitest1函数声明(有返回值时与.m形参不一样) //咱们的项目中是:extern LIB_GuiTestLib_CPP_API void MW_CALL_CONV guitest1(const mwArray& ctrl1); guitest1(mw_hid); CString FigName =_T("_guitest_"); static HWND hFig = ::FindWindow(NULL, FigName); // 得到Figure窗口句柄 static long lStyle = ::GetWindowLong(hFig, GWL_STYLE);//得到窗口样式 // 去掉Figure窗口的标题栏和边框 ::SetWindowLong(hFig, GWL_STYLE, lStyle & (~WS_CAPTION) & (~WS_THICKFRAME)); ::SetWindowPos(hFig, NULL, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE| SWP_FRAMECHANGED); //获取绘图区域的位置和大小 RECT PlotRec; static CWnd *PlotArea = GetDlgItem(IDC_PLOTAREA); PlotArea ->GetWindowRect(&PlotRec); long Width = PlotRec.right - PlotRec.left; long Height = PlotRec.bottom - PlotRec.top; // 设置Figure窗口为VC界面的子窗口并调整位置 ::SetParent(hFig, PlotArea ->GetSafeHwnd()); ::SetWindowPos(hFig, NULL, 1, 1, Width - 3, Height - 3, SWP_NOZORDER | SWP_NOACTIVATE); //调用COM组件将Figure窗口显示出来 guitest1(mw_show); }
在OnInitDialog()中添加如下的代码:图片
bool res = false; res = mclInitializeApplication(NULL,0); if (!res) { /*DWORD errNO = GetLastError(); CString errString; errString.Format(_T("mclInitializeApplication() is wrong with %d"), errNO); AfxMessageBox(errString);*/ AfxMessageBox(_T("mclInitializeApplication() is wrong!")); } res = GuiTestLibInitialize(); if (!res) { /*DWORD errNO = GetLastError(); CString errString; errString.Format(_T("GuiTestLibInitialize() is wrong with %d"), errNO); AfxMessageBox(errString);*/ AfxMessageBox(_T("GuiTestLibInitialize() is wrong!")); }
添加ondestroy消息处理函数:内存
// TODO: 在此处添加消息处理程序代码 bool res1; res1 = mclTerminateApplication(); if (!res1) { /*DWORD errNO = GetLastError(); CString errString; errString.Format(_T("mclInitializeApplication() is wrong with %d"), errNO); AfxMessageBox(errString);*/ AfxMessageBox(_T("mclTerminateApplication() is wrong!")); } GuiTestLibTerminate();
6.必定要分清x86和x64的区别,分别设置附加依赖项,同时编译时必定要选择x86仍是X64.it
在 Win32 配置下,_WIN32 有定义,_WIN64 没有定义。在 x64 配置下,二者都有定义。即在 VC 下,_WIN32 必定有定义。io
所以,WIN32/_WIN32 能够用来判断是否 Windows 系统(对于跨平台程序),而 _WIN64 用来判断编译环境是 x86 仍是 x64。
7.// 连接器--输入--附加依赖项((对于VS2015,中间必须是回车分开,回车之后自动生成分号,不是空格键,也不是手动添加分号),我就是这里搞错了,才走了那么多弯路。 mclmcrrt.lib; libmx.lib ;libmat.lib ;mclmcr.lib; GuiTestLib.lib