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)(...),然后直接调用即可。
obs plugins 分析
最新推荐文章于 2025-03-28 09:29:46 发布