MATLAB mex文件如何访问MATLAB实例?

时间:2015-12-30 06:59:40

标签: matlab dll mex

这是每个mex文件的入口点:

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

实际上mex文件是以mexFunction为主要功能的windows dll文件。 我的问题是当调用mex函数时,它如何从mex内部访问matlab实例特定数据。例如,考虑“mexPutVariable”'功能。它的工作是将一个数组从MEX函数内部复制到指定的工作区(在mex之外)'。但是它如何知道工作区'在哪里?没有参数传递给mex(像指针一样),包含matlab实例数据(调用者)。 mex文件只知道nlhs,plhs,nrhs,prhs,并且它们都不能帮助mex文件挖掘matlab实例特定数据(调用函数信息)。

1 个答案:

答案 0 :(得分: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);