这是每个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实例特定数据(调用函数信息)。
答案 0 :(得分:1)
一种可能的解决方案是"Matlab.exe"
将mexPutVariable
声明为导出函数:
[Matlab.exe]
int __declspec(dllexport) mexPutVariable(const char* workspace, const char* name, const mxArray* parray)
{
...
}
使用GetModuleHandle
和GetProcAddress
从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);