2011-11-30 143 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,否則會終止主應用程序〜 –