【问题标题】:Any way to "force" a program with a hung OCX to close?有什么方法可以“强制”一个挂起 OCX 的程序关闭?
【发布时间】:2009-10-20 16:34:14
【问题描述】:

我的 Delphi 7 程序使用 OCX 来控制一些硬件。我没有任何示例代码,因此我正在正确加载/使用/卸载控件。不幸的是,如果我使用硬件并加载 OCX,应用程序关闭时主进程不会完全退出。
如果我使用硬件,OCX 会加载并且一切正常。在程序关闭时,OCX 没有正确卸载并且我的程序没有完全关闭。它在内存中留下了 24 兆的小空间,只能在任务管理器中看到。 如果我重新运行该程序,一切正常,包括硬件。如果我使用硬件然后关闭程序,它会留下另外 24 兆的空间。冲洗并重复。 在我可以让 OCX 代码正常工作之前,如果我现在可以“强制”卸载 OCX 控件?还是强制终止进程?

【问题讨论】:

  • 这是一个启动它自己的进程的“进程外”OXC 吗?
  • 不,它在主进程中执行。
  • 你能发布你用来加载它的代码(包括变量声明)吗?我有一个想法可能是什么问题,但在浪费答案之前需要代码来确认它。

标签: delphi


【解决方案1】:

尝试在调试器下运行程序,在所有单元完成部分和任何 OnClose 方法中设置断点。如果您有一个没有 OnClose 方法的表单,请添加一个。然后观察应用程序终止,看看你能走多远。

【讨论】:

    【解决方案2】:

    您是否尝试过调用 Windows ExitProcess 函数?

    【讨论】:

      【解决方案3】:

      OCX 控件就像一个 dll。当进程终止时,它会以一种或另一种方式卸载。当进程关闭时,Windows 会回收所有内存。你在哪里看到这个记忆?只有这个程序叫做活动监视器吗?莫非是那个程序不对?

      更新: 在您提供新信息之后,很明显这不是关于释放内存,而是关于未关闭/终止的进程。

      如果某些线程仍在运行,则可能会发生这种情况。第 3 方控件可能会创建线程但尚未终止它们。这可能是一个错误,或者您可能必须在第 3 方控件上调用一些 finalize/uninitialize/dispose/close 方法?

      【讨论】:

      • Windows 不会回收此内存。 :) 如果我调用硬件并加载 OCX,那么我的程序在关闭时不会释放其所有内存。少量内存,@ 24 megs,保留在内存中。抱歉使用“活动监视器”。我的意思是“任务管理器”。我可以打开任务管理器并在那里关闭剩余的程序。如果这听起来令人困惑,我很抱歉。我运行程序,它运行良好,然后关闭。没问题。如果我运行程序并调用硬件,ocx 会加载,但是当我关闭程序时我的程序并没有完全卸载。
      • 所以进程一直在运行你的意思是?它实际上并没有终止?
      • 非常感谢您的帮助。我将尝试将所有这些内容放在 600 个字符中。如果我执行程序但不调用硬件,则进程终止。如果我运行程序,调用硬件然后关闭程序,内存大小从@ 70 Megs 变为@ 24 Megs 并且进程不会终止。我可以在任务管理器中看到内存减少,直到达到@ 24 megs。如果我运行程序 10 次,调用硬件 10 次,关闭程序 10 次,我将有 10 个运行进程,每个进程有 @ 24 Megs。奇怪的是程序和硬件仍然可以完美运行。
      • 也许最好使用此信息更新您的问题,以便其他人可以更好地理解您的问题。
      猜你喜欢
      • 2010-11-01
      • 1970-01-01
      • 2010-11-07
      • 2015-01-28
      • 1970-01-01
      • 1970-01-01
      • 2014-11-28
      • 2015-04-11
      • 1970-01-01
      相关资源
      最近更新 更多