2011-10-05 227 views
4

现在我正在将Fitnesse的Slim-Server从java移植到Qt,这需要我能够加载尚不存在的类。动态包含类文件

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

所以我想着用插件做这件事。我将做一个接口类并将所需的类文件加载为.dll文件。只是为了获得包含的类文件,似乎有点工作。有没有更简单的方法来做到这一点?

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

+5

在C++中没有简单的方法来“动态加载类”。只有很难的方法。 – Mat

+0

我明白了。猜猜我会用插件去。谢谢! – LarissaGodzilla

+0

对,对不起: -/[this](http://drdobbs.com/cpp/204202899?cid=RSSfeed%255FDDJ%255FCpp)可能会有所帮助。玩的开心! – Mat

回答

1

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

QLibrary类允许动态加载.dll文件,所以我所要做的就是将我的类放入.dll,并添加一个函数,该函数返回指向所需类的指针。

这是.dll's头文件:

#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's 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并调用我喜欢的任何方法。 希望这有助于那些将来会面临类似问题的人。