2015-12-30 59 views
0

這是切入點每MEX文件:MATLAB mex文件如何訪問MATLAB實例?

void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]); 

事實上MEX文件是Windows DLL文件與mexFunction爲主要功能。 我的問題是何時調用mex函數,它如何從mex中訪問matlab實例特定的數據。作爲一個例子,考慮'mexPutVariable'功能。它的工作就是'將MEX函數內的數組複製到指定的工作空間(mex外)「。但它如何知道'工作區'在哪裏。沒有參數傳遞給mex(如指針),包含matlab實例數據(調用者)。 mex文件只知道nlhs,plhs,nrhs,prhs,它們都不能幫助mex文件挖掘matlab實例特定的數據(調用者函數信息)。

回答

1

一種可能的方案是,"Matlab.exe"被聲明mexPutVariable作爲導出函數:

[Matlab.exe] 

int __declspec(dllexport) mexPutVariable(const char* workspace, const char* name, const mxArray* parray) 
{ 
    ... 
} 

它是那麼很容易使用GetModuleHandleGetProcAddress中檢索從DLL這樣的功能:

[Module.dll] 

// Declare function pointer 
int (*FctnPtr)(const char* workspace, const char* name, const mxArray* parray); 

// Retreive the main executable 
HANDLE hExe = GetModuleHandle(NULL); 

// Link to exported function in the exe just like you would do for any dll  
FctnPtr mexPutVariable = (FctnPtr)GetProcAddress(hExe, "mexPutVariable"); 

// Use exported function from the dll 
mexPutVariable("Base", "foo", myArray); 

對於編譯mex文件並在查看mex.h文件後,mexPutVariable被聲明爲與外部函數鏈接:

LIBMWMEX_API_EXTERN_C int mexPutVariable(const char* workspace, const char* name, const mxArray* parray); 

那一轉(當作爲DLL側編譯)是簡單的:

extern "C" int mexPutVariable(const char* workspace, const char* name, const mxArray* parray); 
+0

它是一個可能的答案還是一個真正的答案? –

+0

我沒有matlab的源碼,所以它只能是一個猜測...無論如何不傳遞指針的DLL我看不到任何其他合理的解決方案回調主進程。 – CitizenInsane

+0

作爲替代方案,也許在「.lib」中,你的mex源文件正在鏈接,還有一個導出的函數。爲了初始化'mexPutVariable'等(也就是在初始化時傳遞簡單的指針),matlab也在調用它。 – CitizenInsane