QLibrary Class Reference

[QtCore module]

该QLibrary类加载共享库在运行时。More…

继承QObject

Types

  • enum LoadHint { ResolveAllSymbolsHint, ExportExternalSymbolsHint, LoadArchiveMemberHint }
  • class **[LoadHints]($docs-index.htm)**

Methods

  • __init__ (self, QObject parent = None)
  • __init__ (self, QString fileName, QObject parent = None)
  • __init__ (self, QString fileName, int verNum, QObject parent = None)
  • __init__ (self, QString fileName, QString version, QObject parent = None)
  • QString errorString (self)
  • QString fileName (self)
  • bool isLoaded (self)
  • bool load (self)
  • LoadHints loadHints (self)
  • sip.voidptr resolve (self, str symbol)
  • setFileName (self, QString fileName)
  • setFileNameAndVersion (self, QString fileName, int verNum)
  • setFileNameAndVersion (self, QString fileName, QString version)
  • setLoadHints (self, LoadHints hints)
  • bool unload (self)

Static Methods

  • bool isLibrary (QString fileName)
  • sip.voidptr resolve (QString fileName, str symbol)
  • sip.voidptr resolve (QString fileName, int verNum, str symbol)
  • sip.voidptr resolve (QString fileName, QString version, str symbol)

Detailed Description

该QLibrary类加载共享库在运行时。

一个QLibrary对象的一个实例在一个单一的共享对象文件操作(我们称之为“库” ,但也被称为一个“ DLL” ) 。一个QLibrary提供了一个平台无关的方式访问存储库中的功能。你可以传递一个文件名在构造函数中,或显式设置setFileName( ) 。当加载库时, QLibrary中的所有系统特定的库位置搜索(例如:LD_LIBRARY_PATH在Unix上) ,除非文件名有一个绝对路径。如果文件无法找到, QLibrary试着修改名字用不同平台特定的文件后缀,如“ 。所以”在Unix上, “ dylib的”在Mac上,或在Windows和Symbian 。“ DLL” 。这使得它可以指定只能由他们的基本名(即没有自己的后缀)标识的共享库,所以同样的代码将工作在不同的操作系统。

最重要的功能是load( )动态加载的库文件,isLoaded()来检查装载是否成功,并resolve( )来解决在库中的元件。该resolve( )函数隐式地试图加载库,如果它没有被加载。 QLibrary的多个实例可以用来访问同一个物理磁带库。一旦加载,图书馆保留在内存中,直到应用程序终止。您可以尝试使用卸载库unload( ) ,但如果其他的实例都使用相同的库,则调用将失败,并卸载当每一个实例都调用才会发生unload( ) 。

一个典型的应用QLibrary是解决一个库导出的符号,来调用C函数这个符号表示。这就是所谓的相对于“隐式链接” ,这是由在构建过程中的链接步骤对链接库中的可执行文件时进行“显式链接” 。

注:在Symbian解决使用他们的名字符号仅支持如果库被构建为STDDLL 。否则序必须被使用。另外,在塞班库的路径被忽略,系统默认的库位置始终使用。

下面的代码片段加载一个库,解决了符号“ mysymbol ” ,并调用该函数,如果一切成功。如果出现问题,例如库文件不存在或者符号没有定义,函数指针将是0 ,不会被调用。

  1. QLibrary myLib("mylib");
  2. typedef void (*MyPrototype)();
  3. MyPrototype myFunction = (MyPrototype) myLib.resolve("mysymbol");
  4. if (myFunction)
  5. myFunction();

该符号必须导出为一个C函数的库resolve( )工作。这意味着函数必须被包裹在一个extern "C"如果阻塞的库编译一个C + +编译器。在Windows上,这也需要使用一个dllexport宏;见resolve( )对于如何做到这一点的细节。为方便起见,有一个静态的resolve( )函数,你可以使用,如果你只是想调用的库函数而不明确的加载库:

  1. typedef void (*MyPrototype)();
  2. MyPrototype myFunction =
  3. (MyPrototype) QLibrary.resolve("mylib", "mysymbol");
  4. if (myFunction)
  5. myFunction();

Type Documentation

  1. QLibrary.LoadHint

该枚举描述了可被用来改变库被加载时的处理方式的可能的提示。这些值表示当加载库如何符号解析,并使用指定的setLoadHints()函数。

Constant Value Description
QLibrary.ResolveAllSymbolsHint 0x01 原因在一个库中的所有符号加载时得到解决,而不是简单地当resolve()被调用。
QLibrary.ExportExternalSymbolsHint 0x02 出口未解决的外部符号库中,使他们能够在其他以后加载动态加载的库来解决。
QLibrary.LoadArchiveMemberHint 0x04 允许内的存档文件中指定一个特定的目标文件库的文件名。如果这个提示,给出库的文件名包含一个路径,这是一个参考的存档文件,其次是参照归档成员。

该LoadHints类型是一个typedef为QFlags\u003cLoadHint\u003e 。它存储载入提示值的或组合。

See also loadHints


Method Documentation

  1. QLibrary.__init__ (self, QObject parent = None)

parent的说法,如果不是没有,原因self通过Qt的,而不是PyQt的拥有。

构造一个库与给定parent

  1. QLibrary.__init__ (self, QString fileName, QObject parent = None)

parent的说法,如果不是没有,原因self通过Qt的,而不是PyQt的拥有。

构造一个库对象与给定parent可以加载指定的库fileName

我们建议省略了文件的后缀fileName,因为QLibrary会自动寻找与相应的后缀的文件按照平台,如在Windows “ 。所以”在Unix上, “ 。 dylib的”在Mac OS X ,和“ DLL” 。 (见fileName。 )

注:在Symbian的路径部分fileName被忽略。

  1. QLibrary.__init__ (self, QString fileName, int verNum, QObject parent = None)

parent的说法,如果不是没有,原因self通过Qt的,而不是PyQt的拥有。

构造一个库对象与给定parent可以加载指定的库fileName和主版本号verNum。目前,版本号会被忽略在Windows和Symbian 。

我们建议省略了文件的后缀fileName,因为QLibrary会自动寻找与相应的后缀的文件按照平台,如在Windows “ 。所以”在Unix上, “ 。 dylib的”在Mac OS X ,和“ DLL” 。 (见fileName。 )

注:在Symbian的路径部分fileName被忽略。

  1. QLibrary.__init__ (self, QString fileName, QString version, QObject parent = None)

parent的说法,如果不是没有,原因self通过Qt的,而不是PyQt的拥有。

构造一个库对象与给定parent可以加载指定的库fileName和完整的版本号version。目前,版本号会被忽略在Windows和Symbian 。

我们建议省略了文件的后缀fileName,因为QLibrary会自动寻找与相应的后缀的文件按照平台,如在Windows “ 。所以”在Unix上, “ 。 dylib的”在Mac OS X ,和“ DLL” 。 (见fileName。 )

注:在Symbian的路径部分fileName被忽略。

  1. QString QLibrary.errorString (self)

返回与上次发生错误的描述文本字符串。目前, errorString只会被设置,如果load( )unload()或resolve( )由于某种原因失败。

这个函数中引入了Qt 4.2中。

  1. QString QLibrary.fileName (self)
  1. bool QLibrary.isLibrary (QString fileName)

返回True如果fileName有一个可加载的库的有效后缀,否则返回False 。

Platform Valid suffixes
Windows .dll, .DLL
Unix/Linux .so
AIX .a
HP-UX .sl, .so (HP-UXi)
Mac OS X .dylib, .bundle, .so
Symbian .dll

在Unix尾随版本号将被忽略。

  1. bool QLibrary.isLoaded (self)

返回True如果库被加载,否则返回False 。

See also load( ) 。

  1. bool QLibrary.load (self)

加载库,如果已成功加载的库返回True,否则返回False 。自resolve( )解决,没有必要显式调用它的任何符号前总是调用这个函数。在某些情况下,您可能想预先加载的库,你会在这种情况下使用此功能。

See also unload( ) 。

  1. LoadHints QLibrary.loadHints (self)

[

  1. sip.voidptr QLibrary.resolve (self, str symbol)

返回导出符号的地址symbol。如有必要,该库被加载。该函数返回0,如果符号无法解析,或者无法加载库。

例如:

  1. typedef int (*AvgFunction)(int, int);
  2. AvgFunction avg = (AvgFunction) library->resolve("avg");
  3. if (avg)
  4. return avg(5, 8);
  5. else
  6. return -1;

该符号必须导出为从库中的C函数。这意味着函数必须被包裹在一个extern "C"如果库是编译一个C + +编译器。在Windows上,还必须明确地从使用的DLL导出函数__declspec(dllexport)编译器指令,例如:

  1. extern "C" MY_EXPORT int avg(int a, int b)
  2. {
  3. return (a + b) / 2;
  4. }

MY_EXPORT定义为

  1. #ifdef Q_WS_WIN
  2. #define MY_EXPORT __declspec(dllexport)
  3. #else
  4. #define MY_EXPORT
  5. #endif

注:在Symbian解决与符号名只有当加载的库是作为STDDLL 。否则,该序数必须被使用。

  1. sip.voidptr QLibrary.resolve (QString fileName, str symbol)

这是一个重载函数。

]($docs-index.htm)

加载库fileName并返回导出符号的地址symbol。需要注意的是fileName不应该包括特定于平台的文件后缀(见fileName) 。该库仍然加载,直到应用程序退出。

该函数返回0,如果符号无法解析,或者无法加载库。

注:在Symbian解决与符号名只有当加载的库是作为STDDLL 。否则,该序数必须被使用。

See also resolve( ) 。

  1. sip.voidptr QLibrary.resolve (QString fileName, int verNum, str symbol)

这是一个重载函数。

加载库fileName与主版本号verNum并返回导出符号的地址symbol。需要注意的是fileName不应该包括特定于平台的文件后缀(见fileName) 。该库仍然加载,直到应用程序退出。verNum被忽略的Windows 。

该函数返回0,如果符号无法解析,或者无法加载库。

注:在Symbian解决与符号名只有当加载的库是作为STDDLL 。否则,该序数必须被使用。

See also resolve( ) 。

  1. sip.voidptr QLibrary.resolve (QString fileName, QString version, str symbol)

这是一个重载函数。

加载库fileName有完整的版本号version并返回导出符号的地址symbol。需要注意的是fileName不应该包括特定于平台的文件后缀(见fileName) 。该库仍然加载,直到应用程序退出。version被忽略的Windows 。

该函数返回0,如果符号无法解析,或者无法加载库。

注:在Symbian解决与符号名只有当加载的库是作为STDDLL 。否则,该序数必须被使用。

此功能被引入Qt的4.4 。

See also resolve( ) 。

  1. QLibrary.setFileName (self, QString fileName)
  1. QLibrary.setFileNameAndVersion (self, QString fileName, int verNum)

设置fileName财产和主版本号fileNameversionNumber分别。该versionNumber被忽略的Windows和Symbian 。

注:在Symbian的路径部分fileName被忽略。

See also setFileName( ) 。

  1. QLibrary.setFileNameAndVersion (self, QString fileName, QString version)

设置fileName财产和完整版本号为fileNameversion分别。该version参数被忽略在Windows和Symbian 。

注:在Symbian的路径部分fileName被忽略。

此功能被引入Qt的4.4 。

See also setFileName( ) 。

  1. QLibrary.setLoadHints (self, LoadHints hints)
  1. bool QLibrary.unload (self)

卸载库,如果库可以卸载返回True,否则返回False 。

出现这种情况自动终止应用程序,所以你通常不应需要调用这个函数。

如果其它实例QLibrary使用相同的库,则调用将失败,并卸载只会发生在每一个实例都调用unload ( ) 。

请注意,在Mac OS X 10.3 ( Panther)的,动态库不能被卸载。

See also resolve()和load( ) 。