首页 > 解决方案 > 如何从客户端设置 COM 服务器的 dll 搜索路径?

问题描述

我正在使用 CoCreateInstance() 实例化一个 COM 服务器。我的 COM 服务器稍后会动态加载一些 dll。但它无法找到那些 dll。一种解决方案是将这些路径添加到 PATH 环境变量中,我想避免这种情况。我无法在代码中设置它,因为服务器已经加载,并且在加载后它不会遵守 PATH 设置。最好的解决方案可能是客户端应该能够设置 COM 服务器的搜索路径。可能吗?如何?

标签: c++windowsdllcom

解决方案


假设 COM 服务器仅按名称加载 DLL:

  • 如果 COM 服务器是一个进程内 DLL,它会被加载到客户端的进程中,因此客户端可以使用SetDllDirectory()AddDllDirectory()为自己使用,并且服务器将在加载 DLL 时包含该额外路径。

  • 如果 COM 服务器在进程外 EXE 中,客户端无法PATH在加载服务器之前不改变全局环境的情况下影响服务器的搜索路径,除非服务器公开一个客户端可以调用的 COM 方法让服务器改变自己的搜索路径。

    但是,如果您可以将 DLL 与服务器的 EXE 放在同一个文件夹中,那么这将是操作系统查找它们的第一个位置,那么您根本不必弄乱搜索路径。

如果您可以更改服务器以通过绝对路径加载 DLL,那么您可以将 DLL 放在路径相对于服务器安装路径的文件夹中,并让服务器在运行时检索自己的文件夹路径(通过GetModuleFileName(),剥离文件名),然后将每个 DLL 的相对路径+文件名附加到该基本安装路径。

或者,将 DLL 放在您想要的任何位置,并将这些路径存储在服务器的内部配置中的某个位置。

或者,在注册表中注册 DLL,以便操作系统知道在哪里可以找到它们:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs

推荐阅读