在matlab命令列下呼叫現有的動態連線庫即dll檔案,即非mex檔案。因為dll的編寫者生成該dll時未必想到以後會被matlab呼叫,所以未必會有mexfunction入口。但是這樣的動態連線庫占多數,因此知道呼叫方法還是必要的。
matlab載入並呼叫,關閉dll通過loadlibrary/calllib/unloadlibrary
一般在windows下開發dll程式使用的都是vc++6.0及其後版本。雖然在工程嚮導裡有生成dll的步驟,但是,通過那種預設方式生成的dll介面是針對c++的,matlab載入該dll後不能直接呼叫,得生成c語言型別介面。
比如要建立乙個名為msgbox.dll的動態連線庫,其匯出唯一的乙個介面matmessagebox。用vc++6預設生成的**如下:
msgbox.h檔案
#ifdef msgbox_exports
#define msgbox_api __declspec(dllexport)
#else
#define msgbox_api __declspec(dllimport)
#endif
msgbox.c檔案
#include "msgbox.h"
#include bool apientry dllmain( handle hmodule,
dword ul_reason_for_call,
lpvoid lpreserved
)return true;
}msgbox_api unsigned int matmessagebox(char* caption,char* contain,unsigned int type)
編譯後生成的dll檔案用dependency開啟
匯出的函式名很明顯是c++風格的。看下這種介面是否能被載入(把頭檔案和dll拷到matlab工作目錄下):
看來是載入了,不能呼叫指定函式所以失敗了。
那怎樣生成c語言介面的dll?
修改後的標頭檔案(僅修改標頭檔案宣告即可,cpp不用修改)
#ifdef msgbox_exports
#define msgbox_api __declspec(dllexport)
#else
#define msgbox_api __declspec(dllimport)
#endif
#ifdef __cplusplus
extern "c"
#endif
看下這時生成的dll的介面:
嗯,有點像c風格的介面了,看下呼叫結果
終於彈出對話方塊了。
完external inte***ces-matlab inte***ce to generic dlls-data conversion章節
這裡給出乙個簡單例子
還是msgbox,不過這次要傳入指標引數:
#ifdef msgbox_exports
#define msgbox_api __declspec(dllexport)
#else
#define msgbox_api __declspec(dllimport)
#endif
#include #ifdef __cplusplus
extern "c"
#endif
在matlab中的呼叫方法:
>> loadlibrary('msgbox.dll','msgbox.h')
>> hnd=0;
>> hndptr=libpointer('int32ptr',hnd)
>> calllib('msgbox','matmessagebox',hndptr,'123','456',0)
Matlab2016b 通過mex呼叫opencv
想用matlab做交通標識識別,環境配置過程中,參考了一些博文,但是其實還是蠻費時間。這裡總結和記錄一下過程中所遇到的問題以及解決辦法,希望對大家有幫助。os win7 64bit opencv version 2.4.13 matlab 2016b compiler vs2012 1.首先安裝vs...
Matlab呼叫動態鏈結庫
matlab的優勢就是矩陣計算,大量的演算法庫等,對於非矩陣計算來說可能就沒有多高的效能和優勢。matlab支援使用c語言和fortan編寫擴充套件,這樣就可以彌補matlab不擅長的部分。有些時候我們需要在matlab中呼叫已有的dll,避免寫c擴充套件。比如需要在matlab中獲取機器碼,而這個...
託管非託管Dll動態呼叫
最近經常看到有人問託管非託管 dll呼叫的問題。對於動態庫的呼叫其實很簡單。網上很多 都實現了 dll的靜態呼叫方法。我主要談論下動態庫的動態載入。對於託管動態庫,實現動態載入很簡單。files dwwwing dlldemo.rar code assembly.loadfile filepath ...