代码之家  ›  专栏  ›  技术社区  ›  Eric

如何重新加载经常崩溃的第三方DLL

  •  3
  • Eric  · 技术社区  · 16 年前

    我使用的是用非托管C++编写的第三方DLL,它控制我们拥有的一些硬件。

    不幸的是,这个DLL偶尔会崩溃,我被指派让它自动“重新加载”。我不太确定如何继续获得最佳结果。

    我的项目使用C++.NET 2(2005)。我正在将第三方资料包装在单独的DLL中。我一直在尝试FreeLibrary()和LoadLibrary()。但是,当我freelibrary()时,一些内部的dll依赖项仍然被分配,并且loadlibrary()会因为内存损坏而导致崩溃。

    另一种建议的方法是使用.NET远程处理接口重构整个项目。这将使杀死另一个进程并重新启动它变得更容易,但这将是一个很大的工作。

    有什么建议吗?指针?提示?

    4 回复  |  直到 16 年前
        1
  •  10
  •   Matthew Xavier    16 年前

    最有效的方法是在应用程序的进程中根本不加载该DLL。相反,创建第二个进程,该进程的唯一任务是代表应用程序使用该dll。您可以使用共享内存区域、本地套接字或其他IPC机制来控制代理进程。

    这样,当有问题的DLL崩溃时,您可以简单地让代理进程死掉,而不必担心(几乎不可能的)任务,即试图确保DLL在下降过程中不会损坏任何重要的东西。您的主进程只需要启动代理进程的一个新实例并继续进行。

        2
  •  4
  •   Draemon    16 年前

    我不是Windows专家,但我认为总的想法应该是可行的。

    FreeLibrary负责将一个dll映射到进程内存空间。您看到的损坏可能是由于DLL中的一些代码做了一些“坏”的事情,并且几乎可以肯定地损坏了进程内存。现在,如果它崩溃了,它几乎肯定会杀死正在运行的线程——如果不是整个进程。

    我相信,可靠地恢复和确保未损坏的内存的唯一方法是运行一个牺牲的过程,将其作为包绕恶意DLL。我认为远程处理接口是实现这一点的一种方法。可能还有其他的。

        3
  •  0
  •   Bruce Ikin    16 年前

    loadlibrary和freelibrary是一个开始,但是如果你想在dll中避免崩溃,那么你需要在seh(结构化异常处理)中把所有调用包装到dll中。这与C++异常和Test/catch块有很大的不同。有关详细信息,请参阅msdn。

        4
  •  0
  •   Ironsides    16 年前

    如果动态链接库本身正在崩溃,而您的公司将为此付出代价,那么可能值得花时间重新创建它。最好是解决问题,而不是只是帮它解决问题。