2008-12-10 130 views
3

我正在使用第三方DLL编写的非托管C++来控制我们拥有的某些硬件。如何重新加载经常崩溃的第三方DLL

不幸的是,这个DLL不时崩溃,我的任务是让它自动“重新加载”。我不太确定如何继续获得最佳结果。

我的项目使用C++。Net 2.0(2005)。我将第三方的东西封装在单独的DLL中。我一直在尝试FreeLibrary()和LoadLibrary()。但是,当我FreeLibrary(),一些内部DLL依赖关系仍然分配和LoadLibrary()将使其崩溃,因为内存损坏。

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

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

回答

10

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

这样,当有问题的DLL崩溃时,您可以简单地允许代理进程死掉,而不用担心尝试确保DLL不会破坏重要任务的(几乎不可能的)任务。您的主进程只需要启动一个代理进程的新实例并继续。

4

我不是一个Windows专家,但我认为一般的想法应该成立。

LoadLibrary,FreeLibrary处理将DLL映射到进程内存空间。你看到的腐败大概是由于DLL内部的一些代码做了“坏事”,几乎肯定会破坏进程内存。现在,如果它崩溃了,几乎可以肯定的是它杀死了正在运行的线程 - 如果不是整个过程。

我会采取一个有根据的猜测,可靠恢复和确保无损内存的唯一方法是运行牺牲进程作为流氓DLL的包装。我假设远程接口是这样做的一种方式。可能有其他人。

+0

对,对于本机代码,你永远不知道它损坏了哪些内存(结构) - 包括非常拥有的CLR。 – 2008-12-11 16:44:55

0

LoadLibrary和FreeLibrary是开始,但是如果你想能够在DLL中发生崩溃,那么你需要将所有调用包装到SEH(结构化异常处理)__try/__catch块中的DLL中。注:这与C++异常和try/catch块完全不同。有关更多信息,请参阅MSDN。

0

如果DLL本身崩溃并且您的公司会为此付出代价,那么可能需要投入时间重新创建它。最好解决这个问题,而不是仅仅为了解决问题。

+0

除非你打算进行逆向工程,否则这可能是不可行的。对于仅有软件的DLL而言,这可能是一个合理的建议,但对于驱动程序来说这是不实际的。 – Draemon 2008-12-11 17:14:39