【问题标题】:How to set dll search path for a COM server from client?如何从客户端设置 COM 服务器的 dll 搜索路径?
【发布时间】:2018-11-16 07:32:34
【问题描述】:

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

【问题讨论】:

  • 因为您已经知道路径,并且如果您使用LoadLibrary 加载 DLL,那么只需使用绝对路径。如果您通过 COM 加载它们,则它们没有正确注册。
  • @RichardCritten,它们是非 COM dll,应该从搜索路径中找到。我不能使用绝对路径,因为找出每个依赖 dll 的路径会很乏味。这将是一场维护噩梦。
  • 客户端程序员不太可能为您处理这些问题。一般来说,他们根本不知道这些东西的位置,您的安装程序在注册服务器时会处理它。
  • 请澄清您是在谈论进程内服务器还是进程外服务器
  • @M.M,这是关于进程外服务器的。如果它是进程内的,它会继承客户端的搜索路径,这对我来说已经足够了。

标签: c++ windows dll com


【解决方案1】:

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

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

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

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

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

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

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

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

【讨论】:

  • 我可以更改服务器以通过绝对路径加载dll,但是依赖链呢?我找不到它们并一一加载。此外,由于某些限制,我无法将 dll 保存在服务器所在的文件夹中。因此,目前将路径放在 PATH 环境变量中似乎是唯一的选择。
  • @MohanSawant per Dynamic-Link Library Search Order on MSDN:“如果 DLL 具有依赖关系,系统会搜索依赖的 DLL,就好像它们仅加载了它们的模块名称一样。即使第一个 DLL 是通过指定完整路径加载的。” 为什么你的 DLL 依赖项一开始就分散在各处,而不是将它们全部放在一个地方?是什么阻止了服务器使用SetDllDirectory()/AddDllDirectory() 指定查看依赖项的文件夹?
猜你喜欢
  • 2011-04-09
  • 1970-01-01
  • 1970-01-01
  • 2012-04-28
  • 1970-01-01
  • 2023-03-16
  • 2021-02-15
  • 2010-12-08
  • 2020-12-05
相关资源
最近更新 更多