Я пишу 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
Трудно отследить ошибку Labview при вызове некоторых функций QT DLL. ⇐ C++
Программы на C++. Форум разработчиков
1759956620
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
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79784697/hard-to-track-down-labview-error-when-calling-some-qt-dll-functions[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия