C++ 如何从客户端为COM服务器设置dll搜索路径?

C++ 如何从客户端为COM服务器设置dll搜索路径?,c++,windows,dll,com,C++,Windows,Dll,Com,我正在使用CoCreateInstance实例化COM服务器。我的COM服务器稍后会动态加载一些DLL。但它没有找到那些DLL。解决这个问题的一个方法是将这些路径添加到PATH env变量中,这是我想要避免的。我无法在代码中设置它,因为服务器已经加载,并且在加载后它将不遵守设置的路径。最好的解决方案可能是客户端应该能够设置COM服务器的搜索路径。可能吗?如何加载?假设COM服务器仅按名称加载DLL: 如果COM服务器是进程内DLL,则会将其加载到客户机的进程中,因此客户机可以为自己使用SetDl

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

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

如果COM服务器是进程内DLL,则会将其加载到客户机的进程中,因此客户机可以为自己使用SetDllDirectory或AddDllDirectory,并且服务器在加载DLL时会包含该额外路径

如果COM服务器处于out of proc EXE中,则在加载服务器之前,客户端无法在不更改全局路径环境的情况下影响服务器的搜索路径,除非服务器公开一个COM方法,客户端可以调用该方法让服务器更改其自己的搜索路径

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

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

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

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

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

正如您已经知道的路径一样,如果您正在使用LoadLibrary加载DLL,那么只需使用绝对路径即可。如果您是通过COM加载它们,则它们尚未正确注册。@RichardCriten,它们是非COM DLL,应该从搜索路径找到。我不能使用绝对路径,因为找出每个依赖DLL的路径将是一件乏味的事情。这将是一场维护噩梦。客户端程序员不太可能为您处理这件事。一般来说,他们根本不知道这些东西在哪里,你的安装程序在注册服务器时会处理它。请澄清你说的是进程内还是进程外server@M.M,这是关于进程外服务器。如果它在proc中,它会继承客户端的搜索路径,这对我来说已经足够了。我可以更改服务器以按绝对路径加载DLL,但是依赖链呢?我找不到它们,一个一个地装。此外,由于一些限制,我无法将DLL保存在服务器所在的文件夹中。因此,现在将路径放入PATH env变量似乎是唯一的选项。@MSDN上的MOHANSAWENT per:如果DLL具有依赖项,系统将搜索依赖DLL,就像它们仅加载模块名一样。即使第一个DLL是通过指定完整路径加载的,也是如此。为什么一开始DLL依赖项分散在各个地方,而不是集中在一个地方?是什么阻止服务器使用SetDllDirectory/AddDllDirectory指定查找依赖项的文件夹?