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語言實現代碼。
/*-------------------------------------------------------------------------------
* 產生等間隔的數據向量并返回數據向量的最后一個值和狀態信息
* 輸入: x0--起始值
* deltx--數據間隔
* length--數據長度
* 輸出: y--產生的向量
* lastData--y數組的最后一個值
* status--狀態信息
------------------------------------------------------------------------------- */
void MyFunc(double x0, double deltx, int length, double *y, double &lastData, char* status)
{
for (int i=0; i<length; i++)
{
y[i] = x0 + i * deltx;
}
lastData = y[length-1];
strcpy(status, "ok!");
}
3、Matlab調用方法
對于上面的MyFunc函數,在Matlab中調用主要涉及到了幾個函數的使用,包括loadlibrary/unloadlibrary、libpointer、calllib等函數的使用,分別實現加載/卸載動態庫、定義指針變量、調用函數等功能。
其Matlab中的調用代碼如下所示:
clc, clear all
loadlibrary('MyDll.dll','MyDll.h');
libfunctions MyDll -full;
x0 = 0;
deltx = 1.1;
length = 10;
pY = libpointer('doublePtr',zeros(1,length));
pLastData = libpointer('doublePtr', 1.0);
pStatus = libpointer('cstring', '');
[~, ~, status] = calllib('MyDll','MyFunc', x0, deltx, length, pY, pLastData, pStatus);
disp(['y: [', num2str(pY.value), ']']);
disp(['lastData: ', num2str(pLastData.value)])
disp(['status: ', status])
unloadlibrary MyDll
其中,通過代碼“libfunctions MyDll -full;”可以顯示dll文件中所有的函數信息。
運行結果如下圖所示:

可見,在Matlab中已經成功調用了dll文件中的MyFunc函數并得到了正確的運行結果。
4、備注
在使用calllib函數運行dll文件中的函數時,當參數中傳遞字符類型的指針變量(char *)時,其對應的變量如上例中pStatus的值不會改變,必須通過calllib的返回值得到更新后的值。
本文由編碼那些事原創,請關注+轉發+收藏+點贊,帶你一起長知識!