Трудно отследить ошибку Labview при вызове некоторых функций QT DLL.C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Трудно отследить ошибку Labview при вызове некоторых функций QT DLL.

Сообщение Anonymous »

Я пишу C DLL для вызова библиотеки C++ QT из LabView (Windows10, 64-разрядная версия). Раньше я создавал C DLL для LV, но здесь все принимает странный оборот. Простые вызовы, такие как передача/возврат целого числа, работают, но все более сложные вызовы дают ошибку 1097 в LabView.
Сама библиотека QT довольно сложна (многопоточные сетевые операции), но вызовы C - нет, и простое выполнение вызовов C без базового C++ работает нормально (так что это не проблема stdcall/cdecl).
Тестовая программа на вызове C материал C++/QT работает нормально. Итак, я думаю, что QT делает что-то, что мешает LV (или наоборот), но после многих проб и ошибок я не могу это точно определить. На данный момент у нас закончились идеи.
Очень упрощенный код:
struct wrapper {
void *obj;
};

static QCoreApplication *coreApp = NULL;

wrapper_t *MaBo_create(const char* DebugFile) {
wrapper_t *m;
TmainBoard_API *obj;

if (coreApp==NULL) {
int argc = 0;
coreApp = new QCoreApplication(argc, 0);
}

m=(typeof(m))malloc(sizeof(*m));
obj=new TmainBoard_API();
m->obj=obj;

return m;
}

void MaBo_destroy(wrapper_t *m) {
if (m==NULL)
return;
delete static_cast(m->obj) ;
free (m); m=NULL;

if (coreApp!=NULL) {
coreApp->exit();
delete coreApp;
coreApp = NULL;
}
}

int MaBo_connectClient(wrapper_t *m, const char* addStr, int port, const char* description) {
TmainBoard_API *obj;
if (m==NULL)
return -1;

obj=static_cast(m->obj) ;
try {
obj->connectClient(QString::fromStdString(addStr), port, QString::fromStdString(description));
} catch (const TIPbusError& e) {
qDebug() disconnect();
}

uint16_t MaBo_ReadfwVersion(wrapper_t *m) {
TmainBoard_API *obj;
if (m==NULL)
return 0;

obj=static_cast(m->obj) ;
return obj->ReadfwVersion();
}

// All the calls above work. This one returns the error.
// TpwrControlBlockReal is just a simple struct of a few doubles
void MaBo_getPwrControlBlockReal(wrapper_t *m, bool ihmAreaAccess, struct TpwrControlBlockReal *MBTCBR) {
TmainBoard_API *obj;

obj=static_cast(m->obj) ;
TpwrControlBlockReal M=obj->getPwrControlBlockReal(ihmAreaAccess);
memcpy(MBTCBR, &M, sizeof(TpwrControlBlockReal));
// We tested the alignment and that's not the issue
}


Подробнее здесь: https://stackoverflow.com/questions/797 ... -functions
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»