【混合編程】VC調用Matlab生成的DLL


初衷:

捕捉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

3. http://blog.csdn.net/scut1135/article/details/6246368


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM