< body>QLibrary Class Reference
[QtCore module]
该类加载分享的库在运行时。
#include
继承QObject
注意:所有函数是可重入的
公共类型:
enum LoadHint { ResolveAllSymbolsHint, ExportExternalSymbolsHint, LoadArchiveMemberHint }
flags LoadHints
< body>属性:
• fileName : QString
• loadHints : LoadHints
公共函数:
< body>QLibrary ( QObject * parent = 0 )
< body> QLibrary ( const QString & fileName, QObject * parent = 0 )
QLibrary ( const QString & fileName, int verNum, QObject * parent = 0 )
QLibrary ( const QString & fileName, const QString & version, QObject * parent = 0 )
~QLibrary ()
< body>QString errorString () const
< body>QString fileName () const
< body>bool isLoaded () const
< body>bool load ()
< body>LoadHints loadHints () const
< body>void * resolve ( const char * symbol )
< body>void setFileName ( const QString & fileName )
void setFileNameAndVersion ( const QString & fileName, int versionNumber )
void setFileNameAndVersion ( const QString & fileName, const QString & version )
void setLoadHints ( LoadHints hints )
< body>bool unload ()
< body>
静态公共成员:
bool isLibrary ( const QString & fileName )
< body>void * resolve ( const QString & fileName, const char * symbol )
void * resolve ( const QString & fileName, int verNum, const char * symbol )
void * resolve ( const QString & fileName, const QString & version, const char * symbol )
详细描述:
一个QLibrary对象的实例操作一个单独的共享的库,我们称它为lib或者dll。一个QLibrary提供一种平台独立的方式进入到共享库里的函数。你能传一个文件名在构造器,或者明确地设置它使用setFileName()。当加载库时,QLibrary搜索在所有特别的系统库路径,除非文件名有一个绝对路径。如果文件不能被找到,QLibrary试着修改名字用不同平台的后缀,像“so”在unix上,“dylib”在mac,或者“dll”在windows和symbian上。这样只通过共享库的名字就能找到他们,所以相同的代码将要工作在不同的平台上。
最重要的函数load(),动态的加载库文件。isLoaded()来检查是否加载时成功的,resolve()来分解一个库里的对象。如果库还没有被加载,Resolve()函数将暗中的加载库。QLibrary的多重实例,能被用来进入相同的库。一旦被加载,库将保存在记忆中,直到应用终止。你能试着卸载一个库使用unload(),但是如果其他的实例正在使用相同的库,这个函数将失败,卸载成功将只发生在所有的实例都调用unload()。
一个典型的应用QLibrary是分解一个输出符号,来调用这个符号代表的c函数。这叫做“显示连接”(explicit linking)区别于“隐式连接“(implicit linking)。
注意:在symbian,只有当库时建立作为STDDLL,可以是使用他们的名字俩分解符号。否则序号必须被使用。在symbian,库的路径被忽略,总是使用系统缺省的库路径。
下面的代码片段的加载一个库,分解符号“mysymbol“,调用函数如果每一件事成功。如果有错误,库文件不存在或者符号没有定义,函数指针将是0,并且不被调用。
QLibrary myLib("mylib");
typedef void (*MyPrototype)();
MyPrototype myFunction = (MyPrototype) myLib.resolve("mysymbol");
if (myFunction)
myFunction();
这个符号不需被输出作为一个c函数,为resolve()来工作。这意味着函数将被包裹在一个外部的“c“块中,如果库是使用一个c++编译器编译。在windows上,这将要求一个dllexport宏的使用。看resolve()来了解他是怎样工作的。为了方便起见,有一个静态的resolve()函数,你能使用它,如果你只想调用一个函数而不明确的加载库。
typedef void (*MyPrototype)();
MyPrototype myFunction =
(MyPrototype) QLibrary::resolve("mylib", "mysymbol");
if (myFunction)
myFunction();
成员函数文件:
enum QLibrary::LoadHint
flags QLibrary::LoadHints
这个联合描述可能的暗示,当库被加载时,能被用来改变被处理的库的方式。这些值表明当库被加载时,符号是怎样被分解的,被指明通过使用setLoadHints()。
内容 值 描述
QLibrary::ResolveAllSymbolsHint 0x01 当库被加载时所有的符号被分解,不是当调用resolve时才分解。
QLibrary::ExportExternalSymbolsHint 0x02 输出未分解的或者全局的符号,以至于他们能被分解在以后其他的动态加载发生时。
QLibrary::LoadArchiveMemberHint 0x04 允许库的文件名来署名一个特别的对象文件在一个档案文件内。如果这个暗示被给,库的文件名包含一个路径,他是一个档案文件的路径,紧跟着一个档案成员,。
LoadHints类型是一个为QFlags的类型定义。它存储一个or联合LoadHint值。
属性文件:
fileName : QString
这个属性拥有库的文件名字。
我们推荐省略文件的后缀,因为QLibrary将自动查找文件使用最佳的后缀。
当加载库时,QLibrary搜索在所有特别的系统库路径。
例如,在成功加载unix平台的“GL“库后,fileName()将返回”libGL.so“.如果文件名是”/usr/lib/libGL”,fileName()将返回”/usr/lib/libGL.so”
注意:在symbian,文件名的路径是被忽略的。
通道函数:
QString fileName () const
void setFileName ( const QString & fileName )
loadHints:LoadHints
这个属性告诉load()函数一些暗示来怎样加载。
你可以给一些暗示在符号怎样分解。通常,符号不能被分解在加载时,而是当resolve()调用时才分解。你可以设置ResolveAllSymbolsHint属性,如果平台支持,他将在加载时被分解。
设置ExportExternalSymbolsHint将使全局的符号在加载时被分解。
如果LoadArchiveMemberHint被设置,文件名将有两部分组成。一个路径,它代表一个档案文件,紧跟着档案成员。例如文件名libGL.a(shr_64.o)将表示库shr_64.o是libGL.a的成员。这只支持在AIX平台
加载暗示是平台独立的。如果你使用它,你可能需要根据平台,预设一些条件。
缺省的,这些标志都没有被设置。所以库将被加载使用懒惰的信号分解,将不输出全局符号为其他动态加载库。
通道函数:
LoadHints loadHints () const
void setLoadHints ( LoadHints hints )
成员函数文件;
QLibrary::QLibrary ( QObject * parent = 0 )
QLibrary::QLibrary ( const QString & fileName, QObject * parent = 0 )
构建一个库对像,使用一个被给的parent,和文件名
我们推荐忽略文件名的后缀。
QLibrary::QLibrary ( const QString & fileName, int verNum, QObject * parent = 0 )
目前(主版本号)verNum在window和symbian被忽略。
QLibrary::QLibrary ( const QString & fileName, const QString & version, QObject * parent = 0 )
目前(全版本号)version在window和symbian被忽略。
QLibrary::~QLibrary ()
QString QLibrary::errorString () const
bool QLibrary::isLibrary ( const QString & fileName ) [static]
Platform Valid suffixes
Windows .dll
Unix/Linux .so
AIX .a
HP-UX .sl, .so (HP-UXi)
Mac OS X .dylib, .bundle, .so
bool QLibrary::isLoaded () const
bool QLibrary::load ()
因为resolve()总是先调用这个函数,在分解符号。所以不必明确的调用它。当你想高级的加载库,你可以使用这个函数。
void * QLibrary::resolve ( const char * symbol )
返回输出符号symbol的地址。
typedef int (*AvgFunction)(int, int);
< body> AvgFunction avg = (AvgFunction) library->resolve("avg");
if (avg)
return avg(5, 8);
else
return -1;
在window你必须明确的输出函数从DLL,使用_declspec(dllexport)编译
extern "C" MY_EXPORT int avg(int a, int b)
{
return (a + b) / 2;
}
< body>#ifdef Q_WS_WIN
#define MY_EXPORT __declspec(dllexport)
#else
#define MY_EXPORT
#endif
void * QLibrary::resolve ( const QString & fileName, const char * symbol ) [static]
void * QLibrary::resolve ( const QString & fileName, int verNum, const char * symbol ) [static]
void * QLibrary::resolve ( const QString & fileName, const QString & version, const char * symbol ) [static]
void QLibrary::setFileNameAndVersion ( const QString & fileName, int versionNumber )
void QLibrary::setFileNameAndVersion ( const QString & fileName, const QString & version )
bool QLibrary::unload ()
< body>