如何从客户端设置COM服务器的DLL搜索路径?

时间:2018-06-06 14:49:55

标签: c++ windows dll com

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

1 个答案:

答案 0 :(得分:1)

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

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

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

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

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

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

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

GetModuleFileName()