`
cloverprince
  • 浏览: 130171 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

插件问题回答第1题 另解

阅读更多
问题贴:http://cloverprince.iteye.com/blog/481307

引用
1. 现有一个主程序用C语言写成。现在要允许第三方开发人员编写扩展的模块,约定第三方开发的模块必须提供一系列已知名称的函数(如 foo(),bar(),baz())。如果要求第三方的模块必须与主程序的二进制代码分开发布,把dll或so丢在某个文件夹内即可被动态装载并使用,应如何实现?



回答:

除了用操作系统提供的接口外,还可以用Glib的简单封装。GLib简单封装了操作系统相关的动态库装载函数,位于GModule中。GModule相当于Library Handle,而g_module_open, g_module_symbol和g_module_close分别对应dlopen, dlsym和dlclose函数。


实现:

接口、动态库同原解 http://cloverprince.iteye.com/blog/481309 ,新的主程序如下:
#include <stdio.h>
#include <stdlib.h>

#include <glib.h>
#include <glib/gstdio.h>
#include <gmodule.h>

#include "plugin-interface.h"

const char * const PLUGINS_PATH = "plugins";

int main(int argc, char** argv) {
    GDir *dir;
    const gchar *filename;

    dir = g_dir_open(PLUGINS_PATH,0,NULL);

    while(filename=g_dir_read_name(dir)) {
        GModule *module;
        char *path;

        InitModuleFunc init_func;
        PluginInterface iface;

        printf("Openning %s ...\n",filename);

        path = g_strdup_printf("%s/%s",PLUGINS_PATH,filename);

        module = g_module_open(path,G_MODULE_BIND_LAZY);
        g_module_symbol(module,"init_module",(void**)(&init_func));
        init_func(&iface);

        iface.hello();
        iface.greet("wks");

        g_module_close(module);

        g_free(path);
    }

    g_dir_close(dir);

    return 0;
}



编译:
GLib程序的编译可以利用pkg-config辅助设置编译参数
引用
gcc $(pkg-config --cflags --libs glib-2.0 gmodule-2.0) -o main main.c



执行结果略。
分享到:
评论

相关推荐

    QTP10所有插件破解

    通过破解注册表,破解所有QTP插件,当然,前提是你得安装了这些插件

    解压缩软件插件

    解压缩用的rar插件。可以支持通用的格式。完全通用。你可以下载试试看。

    Discuz_X3.1 X3.2版本正版插件破解文件

    【discuzX3.1 X3.2版本】安装应用后台出现“对不起,您安装的不是正版应用..”的详细解... 很多会员朋友在本网站下载好discuz 模板或者discuz插件上传到网站目录 在后台进行安装的时候会发现 “对不起,您安装的...

    cs 插件 巨龙 巨龙拉冬插件 cs插件

    这里的“CS”通常指的是Counter-Strike(反恐精英),一款非常受欢迎的第一人称射击游戏。而插件是为游戏添加额外功能或修改现有行为的小型程序。 “巨龙拉冬插件”(Ladon)是针对CS游戏的第三方插件,由开发者...

    有道云笔记插件-剪报插件

    第一步:下载得到zip格式的安装文件以后,先行将其解压缩为文件夹 点击下载zip格式安装文件 第二步:打开Chrome浏览器,点击右上角三点,选择【更多工具】-【扩展程序】 第三步:在扩展程序页面中,点击右上角,...

    C#做的自动更新word表、图题注插件(附源码)

    C#做的自动更新word表、图题注插件(附源码) 插件具体说明: word插件:用来生成需要更新的word插件,除了自动更新题注,还提供自定义删除内容(根据word的页码). 插件xp安装环境:.net3.5、vsto、office2007 win7...

    .net压缩解压缩插件

    《.NET压缩解压缩插件:ICSharpCode.SharpZipLib深入解析》 在.NET开发环境中,处理压缩和解压缩任务是一项常见的需求。为了简化这一过程,开发者们常常依赖于第三方库,其中ICSharpCode.SharpZipLib是一个非常流行...

    apabi电子图书馆破解插件

    此破解为方正apabi电子图书馆最新4.4.4.1733版本破解插件,压缩包内包括ceb、cebx永不过期补丁、完全解密补丁,以及cebx修改教程。ceb破解补丁修正了win7下不能执行bug。

    TE插件仓库 typecho插件商店

    TE插件仓库是一个专为Typecho博客系统设计的插件集合平台,它借鉴了GitHub的插件管理方式,为用户提供了一个方便、集中化的插件下载和分享中心。Typecho是一款轻量级的开源博客系统,以其简洁的界面和易于操作的特点...

    VST插件精品合集

    "悦动VST插件合集第一版"的子文件名暗示这可能是某个系列的第一部分,可能包含一系列精心挑选的、能激发音乐创作灵感的VST插件。这些插件可能包括合成器(用于创造各种音色)、采样器(用于播放和编辑预录的音频样本...

    rtx2015插件合集

    为了保证插件的安全性和兼容性,用户应当优先考虑从官方渠道或可信的第三方平台下载插件,并且保持定期更新,以确保与RTX2015的最新版本兼容。插件更新不仅仅是为了增加新功能,更重要的是修复已知问题和漏洞,确保...

    Eclipse插件开发 第1篇到第4篇 开发基础 核心技术 高级进阶 综合实例 eclipse 插件安装方法.zip

    首先,我们来看《Eclipse插件开发 学习笔记 第1篇 开发基础》。这一部分通常会介绍插件开发的基本概念,包括Eclipse插件体系结构、OSGi框架以及如何创建第一个Eclipse插件项目。开发者会学习到Plugin.xml文件的重要...

    1.69插件可换线_1.69插件_问道1.69插件_

    一区通常指的是游戏的第一个服务器或者主要服务器,玩家可能需要根据自己的游戏账号所在区域选择合适的插件配置。而“密钥文件”可能是插件激活或验证所必需的,确保用户使用的是正版插件,防止非法复制和滥用。 ...

    SAP Gui77 smartforms 插件,解决 smartforms 运行异常问题

    "说明.txt"文件则包含了安装和使用插件的指南,通常包括系统需求、安装步骤、常见问题解答以及可能的解决方法。在开始安装或使用插件之前,仔细阅读这个文件可以帮助避免不必要的问题,并确保顺利地应用插件。 在...

    Chrome插件-《Astro Bot》用新标签页刷编程题.zip

    《Astro Bot》是一款专为程序员设计的Chrome浏览器插件,它创新性地将编程题和相关新闻融入到浏览器的新标签页之中,旨在帮助用户在浏览网页的同时,保持学习和提升编程技能的习惯。这款插件的独特之处在于其...

    CAD切剖面插件

    CAD切剖面插件是一款专为计算机辅助设计(CAD)软件设计的辅助工具,主要用于帮助用户在二维或三维模型中创建、编辑和分析切剖视图。在工程设计、建筑规划以及产品开发等领域,切剖面是理解复杂几何形状内部结构的...

    unity选择题Demo Quiz Maker v1.2(答题插件).unitypackage

    问答插件

    SA插件第一人称

    "SA插件第一人称"是一个针对特定游戏的插件,主要是为了让玩家体验到第一人称视角的游戏玩法。在传统的第三人称视角游戏中,玩家通常能看到角色的全身或部分身体,而第一人称视角则模拟了角色的眼睛,提供更加沉浸式...

    乐玩插件8.02.rar

    乐玩插件8.02是一款专为提升用户体验和功能扩展而设计的软件插件,其版本号为8.02,表明它经过了多次迭代和优化,旨在提供更稳定、更高效的服务。该插件可能适用于各种平台,如Windows、Android或iOS,具体取决于其...

    discuz论坛积分商城插件

    第一步:首先利用上传工具FTP,将插件上传至网站空间(相信你会搭建论坛,这步应该不是问题,此处滤过) 第二步:找到source文件夹。双击source,可以看到有许多文件,找到plugin的文件夹。进入plugin文件夹,把...

Global site tag (gtag.js) - Google Analytics