初衷:
捕捉Matlab生成的對話框,嵌入到VC的對話框里。本文是第一步,做到在VC里,調
用Matlab,彈出對話框。
參考資料:深入淺出 MATLAB 7.X 混合編程 董維國 2005年 (章節號 7.4.1)
問題:
該書較早,采取的平台較老。
我的平台:
Win7 32位 旗艦版
Matlab R2010b(7.11)
Vs2005
遇見的問題:
內存錯誤。如圖:
原因:
經過網上查找,可能的原因如下:
a. 配置屬性——常規——公共語言運行庫支持——clr 沒有效果
b. #include "mclcppclass.h" 還是不行
c. 將dll 文件 加入到工程(增加——現有項) 沒有效果。這個本來就沒道理
d. 在調用函數前加上 xxxInitialize(); !!!!有效
最后,經過測試,第四條,需要將引用的庫初始化,是解決問題的關鍵。
========================================================================
以下是詳細的過程:
一、 Matlab的設定
1. 設定Matlab的編譯器
mex -setup mbuild -setup
根據Matlab的提示,選擇合適的編譯器。這里選擇Vs2005 的編譯器。
2. 將.m文件編譯生成所需的 .dll .lib .h文件
mcc -W cpplib:YouLibName -T link:lib YourMatlabFile.m
參數含義:可以 help mcc 進行查看
生成后的文件包括:
由於只用到 .dll .lib .h文件,所以有這三個即可。有的教程里會提到.ctl文件,如果沒有也不必擔心。
是Matlab不同版本的原因。
二、 VS的設定
Vs的設定比較簡單,與調用任何第三方(動態)庫一樣,需要加上兩個目錄:
1. 包含頭文件目錄 && 包含lib庫目錄
項目——屬性——配置屬性——C/C++——常規——附加包含目錄
"D:\Program Files\MATLAB\R2010b\extern\lib"; "D:\Program Files\MATLAB\R2010b\extern\include"
這一步也可以在 工具——選項——項目和解決方案——VC++目錄 里設置。這樣對所
有的工程有效,不必每次都設置搜索目錄。
2. 指定要調用的第三方庫(即Matlab編譯生成的dll 與 lib 文件)
項目——屬性——配置屬性——鏈接器——輸入——附加依賴項
mclmcrrt.lib libEnd.lib(生成的.lib文件)
若是較早的Matlab版本,可能會需要加入別的庫。
三、 編寫代碼。
此處以 基於對話框的程序(bookTest)為例。
1. 將生成的 .lib .dll .h 文件拷貝到新建工程的源代碼目錄,並將.h文件添加進
工程。
2. 在bookTestDlg.h里包含動態庫的頭文件
#include "libEnd.h"
3. 在CbookTestDlg::OnInitDialog()里,對MCR及生成的庫進行初始化
// TODO: 在此添加額外的初始化代碼 if (!mclInitializeApplication(NULL,0)) { MessageBox(_T("Initilize error!")); return TRUE; } libEndInitialize();
4.為對話框添加按鈕,在按鈕的響應函數里添加代碼:
void CbookTestDlg::OnBnClickedButton1() { // TODO: 在此添加控件通知處理程序代碼 xxx();// 生成的庫里的函數 }
5. 在退出時,釋放調用的庫。
void CbookTestDlg::OnClose() { // TODO: 在此添加消息處理程序代碼和/或調用默認值 libEndTerminate(); mclTerminateApplication(); CDialog::OnClose(); }
四、 運行效果
參考文獻:
1. 《深入淺出 MATLAB 7.X 混合編程 董維國 2005年 》7.4節
2. http://wenku.baidu.com/view/03be8cbc960590c69ec37691.html