MATLAB呼叫非MEX型別動態庫

2021-07-01 21:43:35 字數 2239 閱讀 2179

在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 ...