【问题标题】:PowerBuilder application call the Delphi DLLPowerBuilder 应用程序调用 Delphi DLL
【发布时间】:2011-11-30 16:42:41
【问题描述】:

我用PB调用了一个Delphi DLL(multithread sockets dll)文件,当PB应用程序关闭时,它并没有真正终止,它仍然停留在任务管理器中!!!为什么?我怎样才能释放 powerbuilder应用程序终止后的多线程套接字DLL? 提前感谢您的回复!

【问题讨论】:

  • 您没有提供足够的信息让我们为您提供帮助。您如何从 PowerBuilder 中“调用”Delphi DLL? PB 有没有办法通知 DLL 它正在退出,以便 DLL 可以清理线程?
  • 如果你查看任务管理器,或者更好的是 SysInternals ProcessExplorer,你会看到你的 PB 应用程序没有被终止。如果是,则 DLL 不能在内存中。
  • @Chris - OP 说 PB 留在任务管理器中。无论如何,DLL 不会显示在任务管理器中。
  • @Ken,我只是指出“powerbuilder 应用程序终止”的断言实际上并没有发生。
  • @Chris - 啊,明白了。 :) OP 在术语上的混淆;一个地方“申请表关闭”,另一个地方“申请终止”。

标签: multithreading delphi sockets dll powerbuilder


【解决方案1】:

一个由 Powerbuilder 应用程序加载的 Delphi 编写的 dll,如果 Powerbuilder 应用程序真正终止,它可能进行的任何网络通信都不会存在。

在 Windows 中,在 Powerbuilder 终止进程后,任何东西都不可能让你的进程保持活动状态,除非那个东西是由 delphi DLL 创建的 delphi DLL 中的线程。

我建议您使用 delphi 调试器监视应用程序中存在的线程。您可以从您的 delphi IDE 启动您的 powerbuilder 应用程序,方法是打开您的 delphi 项目(用于构建 DLL)并设置项目运行选项,以便运行加载 DLL 的 powerbuilder 应用程序是“可执行文件” Delphi IDE 中的 RUN -> 参数对话框。

现在在调试中运行整个程序(delphi IDE 工具栏中的绿色箭头按钮)并打开线程面板,观察在 delphi 应用程序中启动的线程。如果 delphi DLL 没有启动任何额外的线程(比如 powerbuilder 主线程是您可以看到的唯一线程),那么 Delphi DLL 不可能让您的应用程序保持打开状态。

事实上,最有可能发生的事情是您的程序由于 powerbuilder 或 DLL 中的一些基本问题而冻结(崩溃)。同样,解决问题可能需要您使用 powerbuilder 和 delphi 进行一些调试。更多信息将帮助人们帮助您。

【讨论】:

  • Warren,最初的问题说它是一个用 Delphi 编写并由 PowerBuilder 加载的多线程套接字 DLL。您已经花了五段时间基本上重申了原始问题所说的内容。 :) 问题很可能是 DLL 运行的线程未正确终止,并且 PB 正在等待 DLL 在完全退出之前卸载或发出信号;这就是为什么我要求 OP 提供更多信息。 (克里斯紧随我的评论指出,OP 不正确地使用了“终止”和“表单关闭”。)
  • 感谢@KenWhite 和@Chris 的帮助!我已经通过折衷方法解决了这个问题:
    procedure DllMain(Reason:Integer); begin case Reason of DLL_PROCESS_ATTACH: begin Client:=TAppClient.Create; end; DLL_THREAD_ATTACH: begin end; DLL_THREAD_DETACH: begin end; DLL_PROCESS_DETACH: begin Client.Free; TerminateProcess(GetCurrentProcess,0);// this line end; end; end;
  • 但是这个方法只适用于用PB(或Delphi)静态调用DLL,否则会终止主应用程序~
  • DLL 应该调用TerminateProcess!这只是杀死 PB 而不给它任何清理的机会。您只需要确保所有线程都已终止(干净地停止),并且不理会 PB;一旦线程停止并且可以卸载 DLL,它应该正确关闭。
  • 这个问题没用,但还需要一票才能结束。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-07
  • 2016-11-09
  • 1970-01-01
相关资源
最近更新 更多