DLL应用程序的联机更新 我有一个插件应用程序,它是一个C++(DLL)运行在一个(外部)C++主机中。 我想允许插件的在线更新。 我该怎么做

DLL应用程序的联机更新 我有一个插件应用程序,它是一个C++(DLL)运行在一个(外部)C++主机中。 我想允许插件的在线更新。 我该怎么做,c++,dll,updates,C++,Dll,Updates,一种可能的方法是将DLL分离为包装DLL和内容DLL,然后 在每次更新时移动到新的内容DLL 有没有更好的方法来实现这一点 谢谢如果您无法控制主机,那么您必须自己进行动态加载/卸载。正如您正确注意到的,您需要两个DLL来完成此操作。这可能是最简单的方法,但您需要确保在交换DLL时主机不会造成任何伤害。最简单的解决方案可能是加载两个DLL,然后在卸载旧代码之前在它们之间执行原子切换。一个问题是如何让主机应用程序重新启动/重新加载插件,以及如何让它用另一个DLL替换您的DLL 在Windows下(假

一种可能的方法是将DLL分离为包装DLL和内容DLL,然后 在每次更新时移动到新的内容DLL

有没有更好的方法来实现这一点


谢谢

如果您无法控制主机,那么您必须自己进行动态加载/卸载。正如您正确注意到的,您需要两个DLL来完成此操作。这可能是最简单的方法,但您需要确保在交换DLL时主机不会造成任何伤害。最简单的解决方案可能是加载两个DLL,然后在卸载旧代码之前在它们之间执行原子切换。

一个问题是如何让主机应用程序重新启动/重新加载插件,以及如何让它用另一个DLL替换您的DLL

在Windows下(假设Windows,因为您说的是DLL),您有一个问题,即在将可执行映像(包括DLL)加载到内存时,无法将其替换为另一个映像。在POSIX下,这不会有任何问题(甚至可以可靠地工作,没有任何副作用!),但Windows将锁定映像以进行独占访问

因此,您别无选择,只能先卸载DLL,然后替换它,然后再次加载它。这可以按照您描述的方式完成


如果主机应用程序允许,另一种选择是编写第二个独立插件,它告诉应用程序卸载要更新的插件,然后更新它,然后告诉主机应用程序重新加载它。

是的,您不能直接更新正在使用的DLL。带有两个DLL的解决方案可以工作,但可能很复杂。至少我不会在应用程序运行时卸载和加载新的DLL。下次加载插件时,请下载并加载新的DLL

此外,您可以将更新程序设置为autostart文件夹中的EXE(无第二个DLL)。如果有更新,它会下载文件并将其复制到正确的位置。如果由于错误_ACCESS _DENIED而失败,则用户已启动应用程序,您的更新将在用户下次登录时进行复制。
我认为这对用户来说更简单、足够(您必须决定),而且透明-他可以从autostart文件夹中删除更新或手动启动更新。

移动到另一个dll意味着您必须卸载它,然后再次加载它。因此,您建议的分离不会真正解决任何问题,因为您仍然需要卸载内容dll。