问题贴:
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
执行结果略。
分享到:
相关推荐
通过破解注册表,破解所有QTP插件,当然,前提是你得安装了这些插件
在电子设计大赛中,开发抽题小插件是一项常见的任务,用于随机选择参赛者需要解答的问题。本项目名为"C#抽题小插件",它采用C#编程语言实现,主要用于打开并处理PDF文件,这涉及到C#与PDF文档交互的技术。下面将详细...
解压缩用的rar插件。可以支持通用的格式。完全通用。你可以下载试试看。
【discuzX3.1 X3.2版本】安装应用后台出现“对不起,您安装的不是正版应用..”的详细解... 很多会员朋友在本网站下载好discuz 模板或者discuz插件上传到网站目录 在后台进行安装的时候会发现 “对不起,您安装的...
一款仿学习强国填空题输入的jQuery代码脚本,填空题固定输入字符的数量。 兼容android与iOS手机的浏览器 标签<span></span>即代表填空题的一个空格,提交后获取json数据。
这里的“CS”通常指的是Counter-Strike(反恐精英),一款非常受欢迎的第一人称射击游戏。而插件是为游戏添加额外功能或修改现有行为的小型程序。 “巨龙拉冬插件”(Ladon)是针对CS游戏的第三方插件,由开发者...
第一步:下载得到zip格式的安装文件以后,先行将其解压缩为文件夹 点击下载zip格式安装文件 第二步:打开Chrome浏览器,点击右上角三点,选择【更多工具】-【扩展程序】 第三步:在扩展程序页面中,点击右上角,...
C#做的自动更新word表、图题注插件(附源码) 插件具体说明: word插件:用来生成需要更新的word插件,除了自动更新题注,还提供自定义删除内容(根据word的页码). 插件xp安装环境:.net3.5、vsto、office2007 win7...
《.NET压缩解压缩插件:ICSharpCode.SharpZipLib深入解析》 在.NET开发环境中,处理压缩和解压缩任务是一项常见的需求。为了简化这一过程,开发者们常常依赖于第三方库,其中ICSharpCode.SharpZipLib是一个非常流行...
此破解为方正apabi电子图书馆最新4.4.4.1733版本破解插件,压缩包内包括ceb、cebx永不过期补丁、完全解密补丁,以及cebx修改教程。ceb破解补丁修正了win7下不能执行bug。
TE插件仓库是一个专为Typecho博客系统设计的插件集合平台,它借鉴了GitHub的插件管理方式,为用户提供了一个方便、集中化的插件下载和分享中心。Typecho是一款轻量级的开源博客系统,以其简洁的界面和易于操作的特点...
"悦动VST插件合集第一版"的子文件名暗示这可能是某个系列的第一部分,可能包含一系列精心挑选的、能激发音乐创作灵感的VST插件。这些插件可能包括合成器(用于创造各种音色)、采样器(用于播放和编辑预录的音频样本...
为了保证插件的安全性和兼容性,用户应当优先考虑从官方渠道或可信的第三方平台下载插件,并且保持定期更新,以确保与RTX2015的最新版本兼容。插件更新不仅仅是为了增加新功能,更重要的是修复已知问题和漏洞,确保...
首先,我们来看《Eclipse插件开发 学习笔记 第1篇 开发基础》。这一部分通常会介绍插件开发的基本概念,包括Eclipse插件体系结构、OSGi框架以及如何创建第一个Eclipse插件项目。开发者会学习到Plugin.xml文件的重要...
一区通常指的是游戏的第一个服务器或者主要服务器,玩家可能需要根据自己的游戏账号所在区域选择合适的插件配置。而“密钥文件”可能是插件激活或验证所必需的,确保用户使用的是正版插件,防止非法复制和滥用。 ...
"说明.txt"文件则包含了安装和使用插件的指南,通常包括系统需求、安装步骤、常见问题解答以及可能的解决方法。在开始安装或使用插件之前,仔细阅读这个文件可以帮助避免不必要的问题,并确保顺利地应用插件。 在...
《Astro Bot》是一款专为程序员设计的Chrome浏览器插件,它创新性地将编程题和相关新闻融入到浏览器的新标签页之中,旨在帮助用户在浏览网页的同时,保持学习和提升编程技能的习惯。这款插件的独特之处在于其...
CAD切剖面插件是一款专为计算机辅助设计(CAD)软件设计的辅助工具,主要用于帮助用户在二维或三维模型中创建、编辑和分析切剖视图。在工程设计、建筑规划以及产品开发等领域,切剖面是理解复杂几何形状内部结构的...
问答插件
"SA插件第一人称"是一个针对特定游戏的插件,主要是为了让玩家体验到第一人称视角的游戏玩法。在传统的第三人称视角游戏中,玩家通常能看到角色的全身或部分身体,而第一人称视角则模拟了角色的眼睛,提供更加沉浸式...