2011-11-30 141 views
1

我使用PB调用一个Delphi DLL(多线程套接字dll)文件,当PB应用程序窗体关闭时,它并没有真正终止,它仍然保留在任务管理器中!为什么?如何在powerbuilder应用程序终止后发布 多线程套接字DLL? 在此先感谢您的回复!PowerBuilder应用程序调用Delphi DLL

+0

您没有提供足够的信息以便我们帮助您。你如何从PowerBuilder中“调用”Delphi DLL?有没有办法让PB通知DLL它正在退出,以便DLL可以清理线程? –

+0

如果你看看任务管理器,或者更好的SysInternals ProcessExplorer,你会发现你的PB应用程序没有被终止。如果是的话,该DLL不能在内存中。 –

+0

@Chris - OP说PB保留在任务管理器中。无论如何,DLL不会显示在任务管理器中。 –

回答

1

如果Powerbuilder应用程序真正终止,那么使用PowerBuilder应用程序加载的Delphi编写的dll不会执行任何网络通信。

在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进行一些调试。更多的信息会帮助人们帮助你。

+0

Warren原来的问题是这是一个用Delphi编写并由PowerBuilder加载的多线程套接字DLL。你花了五段时间基本上重申了原来的问题。 :)问题很可能是DLL运行的线程没有正确地被终止,并且PB正在等待DLL卸载或者在它完全退出之前发信号;这就是为什么我要求OP提供更多信息。 (克里斯的评论立即跟随我的观点,指出OP不恰当地使用“终止”和“表单关闭”) –

+0

感谢@KenWhite和@ Chris的帮助!我已经用妥协方法解决了这个问题:
'procedure DllMain(Reason :整数); 开始 案例原因 DLL_PROCESS_ATTACH: 开始 客户端:= TAppClient。创建; 结束; DLL_THREAD_ATTACH: begin end; DLL_THREAD_DETACH: begin end; DLL_PROCESS_DETACH: begin Client.Free; TerminateProcess(GetCurrentProcess,0); //这一行 end; 结束; end;' –

+0

但是这种方法只适用于用PB(或Delphi)静态调用DLL,否则会终止主应用程序〜 –