QLibrary Resolution возвращает false - PullRequest
1 голос
/ 06 октября 2011

Я сейчас пытаюсь динамически включать файлы классов и решил сделать это, загрузив .dll в QLibrary.Проблема, с которой я столкнулся сейчас, заключается в том, что когда я пытаюсь вызвать метод resol (), он возвращает 0.

РЕДАКТИРОВАТЬ: Тем временем проблема была решена, и я решил отредактировать код, поэтомудругие могут видеть, как это работает:

Это заголовочный файл .dll:

#ifndef DIVFIXTURE_H
#define DIVFIXTURE_H

#include<QObject>
#include<QVariant>

class __declspec(dllexport) DivFixture : public QObject
{
    Q_OBJECT
public:
    Q_INVOKABLE DivFixture();
    Q_INVOKABLE void setNumerator(QVariant num);
    Q_INVOKABLE void setDenominator(QVariant denom);
    Q_INVOKABLE QVariant quotient();

private:
    double numerator, denominator;
};

#endif

это DLL-файл .cpp-файл:

#include "testfixture.h"

DivFixture::DivFixture(){}

void DivFixture::setNumerator(QVariant num)
{
    numerator=num.toDouble();
}


void DivFixture::setDenominator(QVariant denom)
{
    denominator=denom.toDouble();
}


QVariant DivFixture::quotient()
{
    QVariant ret;
    ret=numerator/denominator;
    return ret;
}

//non-class function to return pointer to class
extern "C" __declspec(dllexport) DivFixture* create()
{
   return new DivFixture();
}

И вот как я загружаю свой класс:

currentFixture.setFileName("C:\\somepath\\testFixture.dll");
if(currentFixture.load());
{
    typedef QObject* (*getCurrentFixture)();
    getCurrentFixture fixture=(getCurrentFixture)currentFixture.resolve("create");
    if (fixture)
    {
        Fixture=fixture();
    }
}

Ответы [ 2 ]

2 голосов
/ 06 октября 2011

Вам нужно экспортировать свой класс, используя __ declspec (dllexport)

class __declspec(dllexport) DivFixture : public QObject
{
0 голосов
/ 24 ноября 2016

Принятый ответ не верен.__declspec имеет два возможных параметра:

  • dllexport
  • dllimport

dllexport используется при компиляции библиотеки и dllimport при ссылке на нее.

Qt уже предоставляет определения для этого:

  • Q_DECL_EXPORT
  • Q_DECL_IMPORT

Чтобы правильно использовать их, добавьте что-то вроде:

#if defined(MYSHAREDLIB_LIBRARY)
#  define MYSHAREDLIB_EXPORT Q_DECL_EXPORT
#else
#  define MYSHAREDLIB_EXPORT Q_DECL_IMPORT
#endif

к глобальному заголовку в вашем проекте, который вы включите во все классы, которые хотите экспортировать.Затем измените ваши классы так, чтобы в итоге объявление выглядело следующим образом:

class MYSHAREDLIB_EXPORT DivFixture : public QObject

Полный пример и дополнительная информация приведены в Создание общих библиотек документации Qt.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...