我们的程序需要使用我们自己制作的 COM 服务器。场景如下:安装程序将在每次安装时将程序文件和 COM 服务器文件复制到同一个文件夹中。
目前我们使用 regsvr32 注册 COM 服务器,但这不是很好 - 如果我们开发另一个不相关的程序,也使用相同的 COM 服务器(可能是另一个版本),我们可能会遇到问题 - 因为 CLSID 没有改变,服务器稍后注册的程序将被两个程序使用,第一个程序可能会发生故障。
所以我们需要无注册的 COM。我们可以使用清单,但我已经使用它们一段时间了,发现它们在夜间构建中使用起来不太方便。我们也可以重写程序,而不是调用CoCreateInstance()它调用LoadLibraryEx(),然后GetProcAddress()定位DllGetClassObject(),然后只检索类工厂并使用它。
我立即看到了一些缺点:
- 该程序将依赖于确切的 COM 服务器文件名
- 必须为通常由 Windows 管理的内容编写额外的代码
- COM 服务器必须在进程内,并且永远不会使用编组
并且这些缺点通常可能是展示塞子,但在我们的特定场景中看起来一点也不差。
LoadLibraryEx()使用/DllGetClassObject()相比还有其他缺点CoCreateInstance()吗?