разделить выделенный буфер памяти между динамической библиотекой c ++ и основной программой C - PullRequest
0 голосов
/ 02 марта 2019

Для работы с каркасом сокет-сервера на основе C нам необходимо передать данные между потоком сокет-сервера программы на C и DLL на основе C ++.Операционная система MacOs.

Внутри DLL все работает нормально, и мы можем управлять ядром OCR и БД.Внутри сокет-сервера все работает нормально и уже несколько лет тестируется ESP framework embedthis.com / esp /

С помощью сообщества Stackoverflow мы разработали рабочее решение.Код, который работает сейчас для передачи выделенного буфера памяти из DLL в основную программу:

//in library header
typedef
    struct pageRecord{
        char *data;
    }pageRec;

// in library function
extern "C"{
EXPORT
    pageRec helloVarStr(void) {
        //c++ content
        string stData="www ....";
        pageRec rec;
        rec.data=(char*)calloc(stData.size()+1,1);
        memcpy(rec.data,&stData[0],stData.size());
        return rec;
    }
}
//in socket server thread
       pageRec c=helloVarStr();
       printf("%s",c.data); 

Этот код работает нормально и использует указатель внутри структуры.Но если мы попытаемся использовать только указатель, у нас будет ошибка памяти в программе на C

Ошибка памяти при выполнении этого кода:

 EXPORT
    const char* helloVarStr() {
        //c++ content
        char *str=(char*)calloc(stData.size()+1, 1);
        string stData="www....";
        memcpy(str,(char*)&stData[0],stData.size());
        return str;
    }
//in C language ESP socket server 
       char *report=helloVarStr(&report);  
       printf("%s",report);  //!// memory error

Мы не можем использовать прямой указатель на выделенныйбуфер как функция, возвращаемая из библиотечной функции.Эта проблема существует как при статическом, так и при динамическом связывании.

Почему мы можем использовать указатель в структуре в качестве возврата библиотечной функции, но не сам указатель?Означает ли это, что DLL использовала другое адресное пространство памяти, к которому мы не можем получить прямой доступ?

Для этого решения требуется 6 ТБ, 1 запрос на секунду сокет-сервера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...