包括动态的类文件

时间:2011-10-05 08:32:23

标签: c++ qt

现在我正在努力将Fitnesse的Slim-Server从java移植到Qt,这要求我能够加载尚不存在的类。

我已经在这里找到了如何实例化未知类的方法: How I can get QMetaObject from just class name? 但为此我需要包含class.h文件,对吗?

所以我想过用插件做这件事。我会做一个接口类并将所需的类文件加载为.dll文件。只是为了获得包含的类文件似乎有点多工作。有没有更简单的方法呢?

编辑: 我现在尝试使用插件,它不起作用。问题如下:
在我的界面中,我必须命名方法,例如“setAttribute” 但我的插件需要有像“setNumerator”这样的方法名称 所以我无法将我的插件与我的界面相匹配。这让我想知道是否有任何方式来包含我的插件而不必先声明一个接口。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

我终于提出了一个解决方案 - 经过几个小时的麻烦 - 现在正在运作。

QLibrary类允许动态加载.dll文件,因此我所要做的就是将我的类放入.dll中,并添加一个函数,该函数返回指向所需类的指针。

这是.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(){}


extern "C" __declspec(dllexport) void DivFixture::setNumerator(QVariant num)
{
    numerator=num.toDouble();
}

extern "C" __declspec(dllexport) void DivFixture::setDenominator(QVariant denom)
{
    denominator=denom.toDouble();
}

extern "C" __declspec(dllexport) 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();
        }
    }

之后我可以获得QMetaObject并调用我喜欢的任何方法。 希望这有助于那些将来会遇到类似问题的人。