微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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并调用我喜欢的任何方法.希望这可以帮助那些将来面临类似问题的人.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐