1. 程式人生 > >VC6.0學習(三)呼叫MatLab 生成動態連結庫

VC6.0學習(三)呼叫MatLab 生成動態連結庫

本人想在win10作業系統下通過VC6.0引用MATLAB生成的dll檔案,這個過程遇到了很多的坑,這裡總結一下具體的過程。

  1. MATLAB生成.dll
    這個過程主要可以在網上參考一些文章關於“ VC三種方法用C++呼叫Matlab”。方法沒有問題,關鍵問題出在了C++ sdk的問題上,因為老一些的MATLAB版本只支援sdk7.1,而這個版本的sdk要在win10系統之前的版本,而在win10作業系統下配置sdk7.1就比較麻煩了。在win10作業系統下使用sdk10相對就方便的多,這樣我們就要選擇支援sdk10的MATLAB版本,通過官網檢視可以檢視,要選擇2017及其更高的版本。選擇了正確的版本我們就可以順利的解決這個問題了。
  2. VC6.0引用MATLAB的.dll
    這裡按照網上相關攻略操作就出現新的狀況了,無法正常引用。經過反覆查詢問題,發現還是相容的問題,VC6.0是32位,然而MATLAB2017b只有64位,所以通過這個版本呼叫的引擎和庫就無法在VC中識別。
    最後我將自己寫好的程式移到了win7,MATLAB2015bwin32的環境後成功編譯,確定了是相容性的問題。

總結

使用VC6.0的話還是在win7下配置相應的環境比較簡單;如果要用win10,那麼需要解決以上兩個問題,關鍵是要配置sdk7.1和安裝MATLAB win32的版本。
下面給一個連線,關於實現matlab與vc混合程式設計,寫的不錯,

https://wenku.baidu.com/view/e081894ee518964bcf847c62.html
但是存在一點問題,我最終是用MATLAB2015bwin32實現的,直接套用它出現了一點問題,貼一下我的程式碼以供參考:

//matlab 求和函式函式
function [c]=Add(a,b)
c=a+b;
end
//VC 中的實現函式
void CTestDlg::OnButton1() 
{

	if( !mclInitializeApplication(NULL,0) ) 
	{ 
		AfxMessageBox("Could not initialize the application.\n"); 
	}

	if(!AddInitialize()) 
	{ 
		AfxMessageBox("Can’t Initalize!");
	} 
mwArray a(1,1,mxDOUBLE_CLASS,mxREAL);
mwArray b(1,1,mxDOUBLE_CLASS,mxREAL);
mwArray c(1,1,mxDOUBLE_CLASS,mxREAL);
double data1=2;
double data2=3;
a.SetData(&data1,1);
b.SetData(&data2,1);
Add(1,c,b,a);
double result=c.Get(1,1); 
CString str2; 
str2.Format("Y=%f",result); 
AfxMessageBox(str2);
}

如果有更好的方法,歡迎討論!