1、引言
最近在開發一個項目時,已經用C語言寫好了主要算法部分,並將主要功能的實現以函數形式封裝到了動態連接庫DLL文件中,但客戶要求提供Matlab調用DLL函數的例子,因此,花了點時間研究了下Matlab語言中調用DLL函數的方法,並記錄下來以作後用。
為簡單起見,下面以DLL文件中的一個簡單的函數調用為例進行說明(當然是虛構的一個函數了,但也涉及到了常用參數類型如指針、字符串等的傳遞)。
2、DLL文件中函數原型說明
本例調用C語言編寫的DLL文件「MyDll.dll」裡的函數「MyFunc」,這個函數原型聲明如下:
#define EXPORT extern "C" __declspec(dllexport)
void MyFunc(double x0, double deltx, int length, double *y, double &lastData, char* status);
該函數產生一個初始值為x0、間隔為deltx、長度為length的一維數組y,並給出該數組的最後一個值lastData和函數的運行狀態信息status。從函數的原型聲明中可以看出,該函數中參數數據類型涉及到了「double」類型、「int」類型和「char」類型(字符串類型),在參數傳遞中也涉及到了值傳遞(x0、deltx、length)和指針(y、lastData、status)傳遞方式,較為複雜。為便於理解,下面給出該該函數的C語言實現代碼。
3、Matlab調用方法
對於上面的MyFunc函數,在Matlab中調用主要涉及到了幾個函數的使用,包括loadlibrary/unloadlibrary、libpointer、calllib等函數的使用,分別實現加載/卸載動態庫、定義指針變量、調用函數等功能。
其Matlab中的調用代碼如下所示:
其中,通過代碼「libfunctions MyDll -full;」可以顯示dll文件中所有的函數信息。
運行結果如下圖所示:
可見,在Matlab中已經成功調用了dll文件中的MyFunc函數並得到了正確的運行結果。
4、備註
在使用calllib函數運行dll文件中的函數時,當參數中傳遞字符類型的指針變量(char *)時,其對應的變量如上例中pStatus的值不會改變,必須通過calllib的返回值得到更新後的值。
本文由編碼那些事原創,請關注+轉發+收藏+點讚,帶你一起長知識!