Russian Qt Forum
Ноябрь 02, 2024, 01:33 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: помогите с dll  (Прочитано 4907 раз)
Olenjonok
Гость
« : Декабрь 07, 2009, 17:38 »

В общем пытаюсь освоить Qt на реальной задачке.. не знаю почему не работает.
Проблема следующая: подключаю библиотеку динамически (это драйвер устройства). Достаю от туда функцию, все работает. Вызываю эту функцию - работает. Как только пытаюсь достать из dll больше 3х функций программа начинает "зависать" в перыой функции. Работает только если запускаю пошагово..
Извините если что коряво написала, первый раз ее смогла найти решение в обсуждениях  Обеспокоенный
Записан
QCasper
Гость
« Ответ #1 : Декабрь 07, 2009, 17:41 »

Так может быть дело в этих самых функциях? Учитывая, что это драйвер устройства...
Записан
Olenjonok
Гость
« Ответ #2 : Декабрь 07, 2009, 17:43 »

я пытаюсь перенести код из си++ в кутэ.. на сях работает..ничего даже не придумываю
Записан
QCasper
Гость
« Ответ #3 : Декабрь 07, 2009, 17:44 »

Тогда нерабочий код в студию.
Записан
Olenjonok
Гость
« Ответ #4 : Декабрь 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();

    }
}

ну вот как-то так..
Записан
Olenjonok
Гость
« Ответ #5 : Декабрь 07, 2009, 17:48 »

уходит с концами в TmkOpen()
Записан
QCasper
Гость
« Ответ #6 : Декабрь 07, 2009, 17:57 »

А абсолютно тот же самый код без Qt точно работает?
Вобщем могу посоветовать искать проблему путём постепенного усложнения/упрощения кода. Наверняка где-то возникает конфликтная ситуация в результате некорректной последовательности вызова или кривых данных (по мнению драйвера).
Записан
Olenjonok
Гость
« Ответ #7 : Декабрь 07, 2009, 18:00 »

Точно работает..
Эх...придется что-нить придумывать по другому(((
Я уже пробовала предложенный вами метод)))
Записан
Olenjonok
Гость
« Ответ #8 : Декабрь 07, 2009, 18:00 »

Тем более что он не абсолютно такой же)) там QLibrary нету))
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.049 секунд. Запросов: 21.