1

我有一个插件应用程序,它是在(外部)C++ 主机内运行的 C++ DLL。我想允许插件的在线更新。我怎样才能做到这一点?

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

有没有更好的方法来实现这一目标?

谢谢

4

3 回答 3

0

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

于 2011-07-05T13:34:45.430 回答
0

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

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

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

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

于 2011-07-05T13:38:54.343 回答
0

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

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

于 2011-07-05T15:25:37.787 回答