Matlab Engine API для динамического связывания C во время выполнения - PullRequest
0 голосов
/ 30 ноября 2018

Я использую 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*/
}

1 Ответ

0 голосов
/ 03 декабря 2018

Я обнаружил, что использовал неправильные имена функций.Я не знаю, в чем разница, но есть функция ENGOPEN и engOpen.видимо работают только строчные.

...