1、引言
最近在開發(fā)一個項目時,已經(jīng)用C語言寫好了主要算法部分,并將主要功能實現(xiàn)部分以函數(shù)形式封裝到了動態(tài)連接庫DLL文件中,但客戶要求提供Matlab調(diào)用DLL函數(shù)的例子,因此,花了點時間研究了下Matlab語言中調(diào)用DLL函數(shù)的方法。
為簡單起見,下面以DLL文件中的一個簡單的函數(shù)調(diào)用為例進行說明(當然是虛構(gòu)的一個函數(shù)了,但也涉及到了常用參數(shù)類型如指針、字符串等的傳遞)。
2、DLL文件中函數(shù)原型說明
本例調(diào)用C語言編寫的DLL文件“MyDll.dll”里的函數(shù)“MyFunc”,這個函數(shù)原型聲明如下:
#define EXPORT extern "C" __declspec(dllexport)
void MyFunc(double x0, double deltx, int length, double *y, double &lastData, char* status);
該函數(shù)產(chǎn)生一個初始值為x0、間隔為deltx、長度為length的一維數(shù)組y,并給出該數(shù)組的最后一個值lastData和函數(shù)的運行狀態(tài)信息status。從函數(shù)的聲明中可以看出,該函數(shù)中參數(shù)數(shù)據(jù)類型涉及到了“double”類型、“int”類型和“char”類型(字符串類型),在參數(shù)傳遞中也涉及到了值傳遞(x0、deltx、length)和指針(y、lastData、status)傳遞方式,較為復雜。為便于理解,下面給出該該函數(shù)的C語言實現(xiàn)代碼。
/*-------------------------------------------------------------------------------
* 產(chǎn)生等間隔的數(shù)據(jù)向量并返回數(shù)據(jù)向量的最后一個值和狀態(tài)信息
* 輸入: x0--起始值
* deltx--數(shù)據(jù)間隔
* length--數(shù)據(jù)長度
* 輸出: y--產(chǎn)生的向量
* lastData--y數(shù)組的最后一個值
* status--狀態(tài)信息
------------------------------------------------------------------------------- */
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調(diào)用方法
對于上面的MyFunc函數(shù),在Matlab中調(diào)用主要涉及到了幾個函數(shù)的使用,包括loadlibrary/unloadlibrary、libpointer、calllib等函數(shù)的使用,分別實現(xiàn)加載/卸載動態(tài)庫、定義指針變量、調(diào)用函數(shù)等功能。
其Matlab中的調(diào)用代碼如下所示:
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文件中所有的函數(shù)信息。
運行結(jié)果如下圖所示:

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