微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在Windows上使用dynamic链接库的dynamic模块

我正在编写一个应用程序,可以通过模块/共享对象/ DLL在运行时扩展。 这些模块可以使用现有程序的API,但也可以提供新的function用于以后加载的模块,因此模块之间可能存在依赖关系。

我目前在Linux下的方法是让每个模块都定义一个depends()函数,它返回一个依赖于其他模块名称的列表。 这样,我可以自己编译和链接每个模块,使用dlopen()和RTLD_LAZY加载模块,首先解决它的依赖关系,然后用RTLD_GLOBAL完全加载它。 这工作得很好,正是我想要的。 它也允许我用一个不同的版本来replace一个模块,而不用重新编译所有其他的模块。

将此端口移植到Windows时出现实际问题。 首先,我没有find任何连接DLL的方法,而没有提供它的所有依赖关系的导出符号表。 有一个我忽略了吗?

其次,Windows API中的LoadLibraryEx似乎无法执行任何延迟加载,因为它不会让我处理依赖关系,而是在它甚至返回之前自动加载所有引用的DLL。 因为我希望在未来实际加载模块之前进行版本检查,所以这不是我想要的。 有什么办法来规避这种行为?

延迟加载的DLL有用,以避免链接特定的function?

Windows中的延迟加载

延迟加载DLL:应用程序启动多次时,“Exception 0xC06D007E:Module not found”

第三个奇怪的是,我不能replace一个DLL,而不依赖于重新编译所有其他模块。 它有时候确实有用,但通常情况下会发生一些疯狂的事情或程序段错误

是否有可能在Windows上编写这样的模块化应用程序? 任何build议或不同的方法,高度赞赏!

更新:只是提供了一些关于我的模块如何在Linux上使用其他function的说明(我也希望在Windows上):每个模块只是返回另一个模块的名称, ()函数并包含其头文件,然后直接在代码调用使用的函数,而不进行任何包装。 这是有效的,因为Linux不需要您在链接时parsing共享对象的所有符号。

您可以手动导出所有函数(使用__declspec(dllexport) )并使用GetProcAddress加载它们。 在这种情况下,您需要知道每个函数的签名,而且仅限于C函数,但是这将会起作用。 如果你编译了这两个模块,你的C函数也可以返回C ++类,稍后再介绍。 使用GetProcAddress & LoadLibrary使模块完全独立。 基本上,你手动做链接,但据我所知,这是你在Linux上做的,对不对?

LoadLibary只加载一个库依赖的库,所以确保它们不依赖于彼此加载。 要么他们真的是独立的,要么是他们不是,如果做得好的话,改变一个库不会强迫另一个库的重新编译(因为你不把它们连接在一起)。

一个好主意是使用像COM这样的东西,所以让你的每个库都返回一个接口,而不是单独的函数。 这样,您可以简单地加载一个完整的DLL,并将它们轻松地链接在一起(传递一个DLL – >传递一个对象)。 查看xpcOM和COM,其实很简单。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐