gpt4 book ai didi

c++ - 动态包含类文件

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:19:38 26 4
gpt4 key购买 nike

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

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

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

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

最佳答案

我终于想出了一个解决方案,经过几个小时的麻烦后,它现在可以正常工作了。

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++ - 动态包含类文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7658609/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com