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