obs plugins 分析

obs 模块插件实现方式:同一导出接口名称,如:obs_module_load,然后所有插件都实现该接口
obs 模块插件加载方式调用关系(非堆栈反序,是正序)如下:
	obs64.exe!OBSBasic::OBSInit(void * view)
		 	obs.dll!AddExtraModulePaths() //添加插件相对于可执行程序的路径
		 	obs.dll!obs_load_all_modules()
				 	obs.dll!obs_find_modules(...)
						obs.dll!load_all_callback(...)
							obs.dll!obs_open_module(...) //使用动态库 LoadLibrary 方式加载,把加载的数据保存到全局的 struct obs_core *obs 链表结构对象中
								obs.dll!load_module_exports(...) //加载同一导出的接口
自定义引用插件的接口:
	导出需要引用的接口:extern "C" __declspec(dllexport) void xxx(...),C++ 动态获取 C 实现的接口地址必需加 extern "C" 进行导出,否则会获取不到该地址。
	封装获取插件接口地址的函数:
void *obs_get_module_func(const char *file, const char *func)
{
	struct obs_module *mod = obs->first_module;
	while (mod) {
		if(!strcmp(file, mod->file))
		{
			return os_dlsym(mod->module, func);
		}
		mod = mod->next;
	}
	return NULL;
}
	获取到接口指针后强制转换成具体的函数类型,如 typedef void(*TPFxxx)(...),然后直接调用即可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值