代码之家  ›  专栏  ›  技术社区  ›  smf68

Windows上带有DLL的动态模块

  •  3
  • smf68  · 技术社区  · 17 年前

    我目前在Linux下的做法是让每个模块定义一个depends()函数,该函数返回它所依赖的其他模块名称的列表。这样,我就可以自己编译和链接每个模块,用dlopen()加载一个模块,然后 RTLD_LAZY ,首先解析其依赖项,然后使用 RTLD_GLOBAL . 这很好用,完全符合我的要求。它还允许我用不同的版本替换模块,而无需重新编译依赖于它的所有其他模块。

    将其移植到Windows时会出现实际问题。首先,我没有找到任何方法来链接一个DLL,而不向它提供所有依赖项的导出符号表。有一个我忽略了吗?

    其次,Windows API中的LoadLibraryEx似乎无法执行任何延迟加载,因为它不让我处理依赖项,而是在返回之前自行加载所有引用的DLL。因为我希望在将来实际加载模块之前也执行版本检查,所以这根本不是我想要的。有没有办法避免这种行为?

    第三件奇怪的事情是,如果不重新编译依赖于DLL的所有其他模块,我就无法替换DLL。它有时确实可以工作,但通常会发生一些不正常的事情,或者程序出现故障。

    1 回复  |  直到 17 年前
        1
  •  4
  •   Anteru    17 年前

    您可以手动导出所有功能(使用 __declspec(dllexport) GetProcAddress . 在这种情况下,您需要知道每个函数的签名,并且仅限于C函数,但这是可行的。如果编译两个模块,C函数也可以返回C++类,稍后对此进行详细说明。使用 GetProcAddress & LoadLibrary

    LoadLibary

    一个好主意是使用COM之类的东西,因此让每个库返回一个接口,而不是单个函数。这样,您就可以简单地加载整个DLL并将它们轻松链接在一起(传递DLL->传递对象)。查找XPCOM和COM,这实际上很容易做到。