Для работы с каркасом сокет-сервера на основе 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 запрос на секунду сокет-сервера.