我编写的某些软件的一部分是COM dll。 其他软件使用此COM dll。
我的软件有一个更新功能,它会下载更新版本的dll,但如果dll正在使用,则更新将失败,因为该文件无法删除或写入。
问题是,如何更新正在使用的COM dll?
我已经考虑过弹出一条消息,要求用户关闭正在使用DLL的所有应用程序,如果这是最佳解决方案,我将如何在弹出之前检测COM dll是否正在使用消息?
提前致谢。
答案 0 :(得分:3)
您无法为现有应用程序更新它,但一种方法是使用不同的文件名或不同的文件夹保存它,并在DLL上调用DllRegisterServer以在新名称下注册它。开始使用您的对象的新应用程序现在应该使用新版本。
答案 1 :(得分:3)
如果只是检测您是否可以替换文件,那么很容易。只是尝试用拒绝阅读的共享标志打开它。如果在另一个进程中加载DLL,那将会失败。使用_fsopen()或CreateFile()。小心竞争条件。
检测哪些进程加载了文件是一个更难的问题,CreateToolhelp32Snapshot()和Process32First / Next加上Module32First / Next枚举进程和它们加载的DLL。仍然难以为用户生成良好的诊断,因此流程名称没有用处。
答案 2 :(得分:2)
下载更新后,必须启动第三个程序(您编写的),该程序在您的COM组件或任何其他要更新的部分上没有任何依赖性。此启动程序或引导程序必须关闭所有部分,卸载它们并安装更新。安装更新后,您可以重新启动应用程序。
如果您还需要下载更新程序本身的更新,您的主程序可以这样做。
答案 3 :(得分:0)
这是一个简单的解决方案。创建一个包装器DLL,将由其他进程使用。在该DLL中,您显式加载/卸载您的DLL,这将受到更新。当然,当更新过程开始时,您将不得不暂停所有呼叫者。