Я использую Matlab Engine API в приложении C, и все работает нормально, но теперь я хочу изменить его с динамического связывания во время загрузки на динамическое связывание во время выполнения с помощью функции LoadLibrary ().
Я могу загрузить библиотеку и получить адрес нужных мне функций, но при попытке открыть движок я получаю нарушение прав доступа:
- "Необработанное исключение 0x002fa001 в myProgram.exe: 0xC0000005: Место чтения нарушения доступа 0x000000fe. ".
Вот как выглядит первая часть моей функции:
void callMatlabFunction(struct matLabIO *mIO, struct auxdata *aux){
static Engine *ep;
static int firstMatlabCall = 1;
typedef Engine *(*engOpen)(const char*);
static engOpen engOpen_ = NULL;
typedef int (*engEvalString)(Engine*, const char*);
static engEvalString engEvalString_ = NULL;
typedef int (*engPutVariable)(Engine*, const char*, const mxArray*);
static engPutVariable engPutVariable_ = NULL;
typedef mxArray* (*engGetVariable)(Engine*, const char*);
static engGetVariable engGetVariable_ = NULL;
typedef int (*engClose)(Engine*);
static engClose engClose_ = NULL;
if (firstMatlabCall){
HINSTANCE engLib = LoadLibrary("LIB/libeng.dll");
if (engLib){
engOpen_ = (engOpen)GetProcAddress(engLib, "ENGOPEN");
engEvalString_ = (engEvalString)GetProcAddress(engLib,
"ENGEVALSTRING");
engPutVariable_ = (engPutVariable)GetProcAddress(engLib,
"ENGPUTVARIABLE");
engGetVariable_ = (engGetVariable)GetProcAddress(engLib,
"ENGGETVARIABLE");
engClose_ = (engClose)GetProcAddress(engLib, "ENGCLOSE");
/* All of these return valid addresses */
}
else{
printf("The MatLab Engine DLL cannot be located. Make sure it
is located in your LIB folder");
}
if (!(ep = engOpen_(NULL))) {
printf("Can't start MATLAB engine");
/* ERROR OCCURS HERE */
}
firstMatlabCall = 0;
}
/*conversion of variables to mxArrays and call to matlab function*/
}