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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QtLib Создание .dll  (Прочитано 3704 раз)
UndeadDragon
Гость
« : Ноябрь 11, 2012, 00:23 »

Всем привет. Пытаюсь создать простую .dll с участием Qt. Сейчас есть такой код:

Код:
#ifndef MATHMODUL_H
#define MATHMODUL_H

#ifdef Q_WS_WIN
#define MY_EXPORT __declspec(dllexport)
#else
#define MY_EXPORT
#endif

#include <QtGui>

extern "C" MY_EXPORT void MathModel(double L, double H, double W, double Vu, double B, double M0, double Au,
double Ro, double C, double Tr, double T0, double Tu, int steps, double n);

static double V,Q,Qc,Qj,Qu,F,j;

static QVector<QPointF> Tp, hp;

MY_EXPORT QVector<QPointF> getData(QString);

#endif // MATHMODUL_H

Код:
#include "mathmodul.h"
#include <qmath.h>

MY_EXPORT void MathModel(double L, double H, double W, double Vu, double B, double M0, double Au,
double Ro, double C, double Tr, double T0, double Tu, double steps, double n){

double dz = L/steps;
F = 1+0.125*pow(H/W,2)-0.625*(H/W);
j = Vu/H;
Q = H*W*Vu*F/2;
Qj = H*W*M0*pow(j,n+1);
Qu = Au*W*(1/B-Tu+Tr);

for(int i = 0; i < steps; i++){

Tp.push_back(QPointF(i*dz,
Tr+(1/B) * log((B*Qj+W*Au) / (B*Qu) * (1-exp(-B*Qu*(i*dz)) / (Ro*C*Q))) +
exp(B*(T0-Tr-(Qu*(i*dz) / (Ro*C*Q))))
));

hp.push_back(QPointF(i*dz,
M0*exp(-B*Tp[i].x()-Tr)*pow(j,n-1))
);

}

Qc = H*W*Vu*F*Ro*3600/2;

}

MY_EXPORT QVector<QPointF> getData(QString WTR){

if(WTR == "Tp")
return Tp;
if(WTR == "hp")
return hp;

return QVector<QPointF>();

}
Оба метода при попытке их использовать вызывают ошибку памяти, короче говоря не заводятся.
Код:
typedef QVector<QPointF> (*getData) (QString);
typedef void (*setVars) (double, double, double, double, double, double, double,
double, double, double, double, double, double, double);

QLibrary myLib("MathModul");
//Проблемы с .dll файлами весьма частое явление
if(!myLib.load()){
QMessageBox::warning(this,"Что-то не так",
QString(tr("Внимание!!! Файл %1 не может быть загружен\n Проверьте его наличие в папке с программой.")).arg("MathModul"),
tr("Okay"));
return;
}

setVars setVariables = (setVars) myLib.resolve("MathModel");
getData getVector = (getData) myLib.resolve("getData");

setVariables(100,2,3,4,1,23,4,1,2.223,232.32,0.33,-23.777,1,10);

QVector<QPointF> vect = getVector("Tp");
extern "C" не могу использовать на второй метод по понятным причинам.
Как завести это детище?
Заранее всем спасибо.
Записан
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



Просмотр профиля
« Ответ #1 : Ноябрь 11, 2012, 12:23 »

Если не использовать extern C, то getData надо резолвить по его реальному имени (смотреть в DLL - должно быить что-то типа "?getData@@YYRT...").
Записан
UndeadDragon
Гость
« Ответ #2 : Ноябрь 11, 2012, 13:57 »

Если не использовать extern C, то getData надо резолвить по его реальному имени (смотреть в DLL - должно быить что-то типа "?getData@@YYRT...").
Не могу только нагуглить, а как мне узнать это реальное имя из dll?
Записан
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



Просмотр профиля
« Ответ #3 : Ноябрь 12, 2012, 08:35 »

Выложи сюда dll и я тебе скажу какое там имя. Я пользуюсь для это plugin FileInfo от TotalCommander с выключенной опцией undecorate.
Записан
Sancho_s_rancho
Гость
« Ответ #4 : Ноябрь 12, 2012, 12:21 »

Выложи сюда dll и я тебе скажу какое там имя. Я пользуюсь для это plugin FileInfo от TotalCommander с выключенной опцией undecorate.

И в следующей версии студии ваша программа вполне возможно перестанет работать. И не дай боже вам  когда-нибудь потребуется перейти на другой компилятор.
Записан
UndeadDragon
Гость
« Ответ #5 : Ноябрь 12, 2012, 18:35 »

Выложи сюда dll и я тебе скажу какое там имя. Я пользуюсь для это plugin FileInfo от TotalCommander с выключенной опцией undecorate.

И в следующей версии студии ваша программа вполне возможно перестанет работать. И не дай боже вам  когда-нибудь потребуется перейти на другой компилятор.
И как тогда поступать? Только C-совместимые функции писать?
Записан
twp
Гость
« Ответ #6 : Ноябрь 12, 2012, 19:21 »

как вариант
Код
C++ (Qt)
#ifndef MATHMODUL_H
#define MATHMODUL_H
 
#include <QtGui>
 
#if defined(MYSHAREDLIB_LIBRARY)
#  define MY_EXPORT Q_DECL_EXPORT
#else
#  define MY_EXPORT Q_DECL_IMPORT
#endif
 
class MY_EXPORT MathModule
{
public:
   static void MathModel(double L, double H, double W, double Vu, double B, double M0, double Au,
double Ro, double C, double Tr, double T0, double Tu, int steps, double n);
 
   static double V,Q,Qc,Qj,Qu,F,j;
 
   static QVector<QPointF> Tp, hp;
 
   static QVector<QPointF> getData(QString);
};
 
#endif // MATHMODUL_H
 
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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