Chinaunix首页 | 论坛 | 博客
  • 博客访问: 78000
  • 博文数量: 11
  • 博客积分: 1476
  • 博客等级: 上尉
  • 技术积分: 167
  • 用 户 组: 普通用户
  • 注册时间: 2008-01-03 13:01
文章分类

全部博文(11)

文章存档

2009年(2)

2008年(9)

我的朋友

分类:

2008-03-28 10:53:57

KDE的组件(Part)是不需要在编译链接的时候进行依赖的。用户可以通过KPluginLoader自动到KDE的服务目录下去寻找所需的组件。另外也可以通过KServiceTypeTrader查询注册的服务。基本上KPluginLoader和KLibLoader是一脉相承的,它提供kde3factory以及kde4factory静态函数查找指定的库文件是否存在。kde*factory最后是通过QLibrary的resolve方法去查询指定的库中是否包含特定的C函数(在C++编译的库中使用了extern "C"声明的函数)。kde3factory查找init_libname(libname是库的名字),kde4factory查找qt_plugin_instance,一旦找到则调用(最终是使用dlsym)相应的函数创建构造组件实例的工厂对象。
例子1:

        m_factory = KPluginLoader("libkecko").factory();
        if ( !m_factory ) {
            m_factory =:KLibLoader:self()->factory("libkecko");
            if ( !m_factory ) {
            kDebug() << "create factory for keckopart failed";
            return;
            }
        }

libkecko是库的名字,与之对应的,你必须提供init_libkecko或者qt_plugin_instance来创建生成组件实例的工厂对象。注意KDE4建议定义组件的名字时不使用lib前缀,比如应该是foo.so而不是libfoo.so,如果有lib前缀,kde3factory函数会有警告信息,其实没有很大关系。
例子2:

void *ph =dlopen("/mnt/sda5/programs/lib/kde4/libkecko.so", RTLD_LAZY);
if ( !ph ) {
    char *err = dlerror();
    kDebug() << "dlopen failed: " << QString(err);
} else {
    dlerror();
    char *err = NULL;
    void* pf = dlsym( ph, "init_libkecko");
    if ( (err = dlerror()) != NULL )
        kDebug() << QString(err);
    dlclose(ph);
} 


上面的例子演示了如何查找库中相应的函数的方法。
阅读(1095) | 评论(0) | 转发(0) |
0

上一篇:没有了

下一篇:mozilla的链接模式

给主人留下些什么吧!~~