动态地包括类文件

including class-files dynamically

本文关键字:文件 包括类 动态      更新时间:2023-10-16

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

我已经知道如何实例化这个未知的类:我如何从类名获得QMetaObject ?但要做到这一点,我需要已经包含class.h文件,对吧?

所以我想用插件来做。我将执行一个接口类,并将所需的类文件加载为.dll文件。只是为了获得包含的类文件似乎要做很多工作。有更简单的方法吗?

编辑:我试着用插件做它现在,它不工作。问题如下:
在我的接口中,我必须为方法命名,例如"setAttribute"。
但是我的插件需要有像"setNumerator"这样的方法名。
所以我无法匹配我的插件与我的界面。这让我想知道是否有任何方法来包含我的插件,而不必首先声明一个接口。什么好主意吗?

我终于想出了一个解决方案,经过几个小时的麻烦,现在已经成功了。

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的pcp文件:

#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并调用我喜欢的任何方法。