c – 动态包含类文件
发布时间:2020-12-16 06:57:37 所属栏目:百科 来源:网络整理
导读:现在我正在努力将Fitnesse的Slim-Server从 java移植到Qt,这要求我能够加载尚不存在的类. 我已经在这里找到了如何实例化未知类的方法: How I can get QMetaObject from just class name? 但为此我需要包含class.h文件,对吗? 所以我想过用插件做这件事.我会
现在我正在努力将Fitnesse的Slim-Server从
java移植到Qt,这要求我能够加载尚不存在的类.
我已经在这里找到了如何实例化未知类的方法: 所以我想过用插件做这件事.我会做一个接口类并将所需的类文件加载为.dll文件.只是为了获得包含的类文件似乎有点多工作.有更简单的方法吗? 编辑: 解决方法
我终于提出了一个解决方案 – 经过几个小时的麻烦 – 现在正在运行.
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:somepathtestFixture.dll"); if(currentFixture.load()); { typedef QObject* (*getCurrentFixture)(); getCurrentFixture fixture=(getCurrentFixture)currentFixture.resolve("create"); if (fixture) { Fixture=fixture(); } } 之后我可以获得QMetaObject并调用我喜欢的任何方法.希望这可以帮助那些将来面临类似问题的人. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |