c – 动态包含类文件

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

我已经在这里找到了如何实例化未知类的方法
How I can get QMetaObject from just class name?
但为此我需要包含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的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并调用我喜欢的任何方法.希望这可以帮助那些将来面临类似问题的人.

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...