Название: помогите с dll
Отправлено: Olenjonok от Декабрь 07, 2009, 17:38
В общем пытаюсь освоить Qt на реальной задачке.. не знаю почему не работает. Проблема следующая: подключаю библиотеку динамически (это драйвер устройства). Достаю от туда функцию, все работает. Вызываю эту функцию - работает. Как только пытаюсь достать из dll больше 3х функций программа начинает "зависать" в перыой функции. Работает только если запускаю пошагово.. Извините если что коряво написала, первый раз ее смогла найти решение в обсуждениях :-[
Название: Re: помогите с dll
Отправлено: QCasper от Декабрь 07, 2009, 17:41
Так может быть дело в этих самых функциях? Учитывая, что это драйвер устройства...
Название: Re: помогите с dll
Отправлено: Olenjonok от Декабрь 07, 2009, 17:43
я пытаюсь перенести код из си++ в кутэ.. на сях работает..ничего даже не придумываю
Название: Re: помогите с dll
Отправлено: QCasper от Декабрь 07, 2009, 17:44
Тогда нерабочий код в студию.
Название: Re: помогите с dll
Отправлено: Olenjonok от Декабрь 07, 2009, 17:47
usb_test.h #ifndef USB_TEST_H #define USB_TEST_H
#include <QtGui/QWidget> #include <QLibrary> #include <QMessageBox>
typedef unsigned long DWORD; #define CALLBAC __stdcall #ifdef _TMK1553B_MRT #define MAX_TMK_NUMBER (8+64-1) #else #define MAX_TMK_NUMBER (8-1) #endif //def TMK1553B_MRT
namespace Ui { class USB_test; }
class USB_test : public QWidget { Q_OBJECT
public: USB_test(QWidget *parent = 0); ~USB_test(); void test(); int TmkInit(char *pszTMKFileName);
private: Ui::USB_test *ui; QLibrary *lib;
typedef int ( *htmkgetmaxn) (void); htmkgetmaxn tmkgetmaxn;
typedef DWORD ( *hTmkOpen) (void); hTmkOpen TmkOpen;
typedef void ( *hTmkClose) (void); hTmkClose TmkClose;
typedef int ( *htmkselect) ( int tmkNumber ); htmkselect tmkselect;
typedef int (*htmkconfig) (int tmkNumber); htmkconfig tmkconfig; };
#endif // USB_TEST_H
usb_test.cpp #include "usb_test.h" #include "ui_usb_test.h" #define TMK_FILE_OPEN_ERROR 21 #define TMK_FILE_READ_ERROR 22 #define TMK_FILE_FORMAT_ERROR 23 #define TMK_UNKNOWN_TYPE 24
USB_test::USB_test(QWidget *parent) : QWidget(parent), ui(new Ui::USB_test) { ui->setupUi(this); lib = new QLibrary("WDMTMKv2"); tmkgetmaxn = (htmkgetmaxn) lib->resolve("_tmkgetmaxn@0"); TmkOpen = (hTmkOpen) lib->resolve("_TmkOpen@0"); TmkClose = (hTmkClose) lib->resolve("_TmkClose@0"); tmkselect = (htmkselect) lib->resolve("_tmkselect@4"); tmkconfig = (htmkconfig) lib->resolve("_tmkconfig@4"); }
USB_test::~USB_test() { delete ui; }
int USB_test::TmkInit(char *pszTMKFileName) { int nResult; int hTMK; char achParams[81]; FILE *hTMKFile;
#ifdef TMK_CONFIGURATION_TABLE for (hTMK = 0; hTMK <= MAX_TMK_NUMBER; hTMK++) { aTmkConfig[hTMK].nType = -1; aTmkConfig[hTMK].szName[0] = '\0'; aTmkConfig[hTMK].wPorts1 = aTmkConfig[hTMK].wPorts2 = 0; aTmkConfig[hTMK].wIrq1 = aTmkConfig[hTMK].wIrq2 = 0; } #endif // if (TmkOpen()) // return TMK_FILE_OPEN_ERROR; if ((hTMKFile = fopen(pszTMKFileName, "r")) == NULL) return TMK_FILE_OPEN_ERROR; while (1) { if (fgets(achParams, 80, hTMKFile) == NULL) { if (feof(hTMKFile)) break; else { nResult = TMK_FILE_READ_ERROR; break; // goto ExitTmkInit; } } if (achParams[0] == '*') break; if (sscanf(achParams, "%u", &hTMK) != 1) continue; if (hTMK > tmkgetmaxn()) { nResult = TMK_FILE_FORMAT_ERROR; break; // goto ExitTmkInit; } nResult = tmkconfig(hTMK); #ifdef TMK_CONFIGURATION_TABLE tmkgetinfo(&(aTmkConfig[hTMK])); #endif if (nResult) break; } /* endwhile(!feof()) */ // ExitTmkInit: fclose(hTMKFile); return nResult; }
void USB_test::test() { if (lib->isLoaded()) { ui->textEdit->setPlainText("yes"); } if(TmkOpen) { int a = TmkOpen(); if (TmkInit("my.cfg")) { QMessageBox::information(0, "Error", "Init error"); exit(0); } int nTmk; for (nTmk = 0; nTmk <= MAX_TMK_NUMBER; ++nTmk) if (!tmkselect(nTmk)) break; int u=MAX_TMK_NUMBER; if (nTmk > MAX_TMK_NUMBER) { QMessageBox::information(0, "Error", "Select error"); exit(0); }
TmkClose();
} }
ну вот как-то так..
Название: Re: помогите с dll
Отправлено: Olenjonok от Декабрь 07, 2009, 17:48
уходит с концами в TmkOpen()
Название: Re: помогите с dll
Отправлено: QCasper от Декабрь 07, 2009, 17:57
А абсолютно тот же самый код без Qt точно работает? Вобщем могу посоветовать искать проблему путём постепенного усложнения/упрощения кода. Наверняка где-то возникает конфликтная ситуация в результате некорректной последовательности вызова или кривых данных (по мнению драйвера).
Название: Re: помогите с dll
Отправлено: Olenjonok от Декабрь 07, 2009, 18:00
Точно работает.. Эх...придется что-нить придумывать по другому((( Я уже пробовала предложенный вами метод)))
Название: Re: помогите с dll
Отправлено: Olenjonok от Декабрь 07, 2009, 18:00
Тем более что он не абсолютно такой же)) там QLibrary нету))
|