2010-07-01 38 views
1

我有一個TClientSocket組件的DLL,它用於與電話系統計算機通信。該DLL只在導出方法中具有PChar參數,並且不使用包。Delphi DLL - TClientSocket事件

當我用Delphi應用程序加載DLL時,所有的事件工作正常,到目前爲止沒有問題。

我的客戶是從控制檯Win32 Cobol程序調用這個DLL,並且TClientSocket在它發生時不會觸發事件,它使用主循環調用DLL中的檢查方法來知道是否有任何從DLL返回電話系統,如果它返回OK然後它調用Get方法,這裏是問題發生的地方:

在TClientSocket.OnRead事件中,我調用TClientSocket.Socket.ReceiveText,並有幾個來自服務器應用程序的返回,什麼讓我覺得這個事件只有在我從DLL調用一個方法時觸發,並且TClientSocket在緩衝區中持有多個返回值。

問題是我找不到任何分隔符來分割這個返回。

我該如何解決這個問題?有沒有什麼我可以添加到我的DLL,以確保OnRead事件每次都不會從Delphi程序調用時觸發?

回答

2

你可能需要在你的DLL的消息循環..(控制檯應用程序缺乏消息泵..)。 SO在你的dll構造函數中實現這樣的東西:

var Msg : TMsg; 
    res : Integer; 


。 。

While true Do Begin 
     res := Integer(GetMessage(Msg, 0, 0, 0)); 
     If res = -1 Then 
      Exit // error 
     else if res = 0 then 
      exit // WM_QUIT received 
     else begin 
      TranslateMessage(Msg); 
      DispatchMessage(Msg); 
     end; 
End; { While } 

在類似的線程 http://www.mofeel.net/1102-comp-lang-pascal-delphi-misc/2763.aspx

+0

我在DLL主程序中做了這個,並且第一次交互的DLL在GetMessage中停止,並且不向前移動。 – 2010-07-01 16:26:27

+0

現在我知道GetMessage等待,直到它收到消息,所以我更改爲PeekMessage,但它返回-1,所以它熄滅。如果我刪除了測試,那麼它永遠不會加載應用程序。 – 2010-07-01 17:09:22

+0

塞薩爾,也許罪魁禍首是COBOL應用程序 看到另一個類似的線程(它是.net,但似乎是處理同一問題) http://www.devnewsgroups.net/windowsforms/t10952-messageloop-thread.aspx – 2010-07-01 18:22:35

0

看一看最近,我遇到了類似的問題,因爲你,我的DLL ClientSocket的作品確定與德爾福exe文件,但不與c-控制檯exe文件,並我記得tclientsocket正在使用選擇事件模式,它需要主線程來處理消息循環,所以,如果你在一個dll中使用非阻塞模式的tclientsocket,主機應該永遠不要阻塞主線程,並且必須執行消息循環(例如,在調用控制檯程序時)。

有時我們不能修改主機代碼(我滿足的情況下),那麼我們可以這樣做

socket.sendtext(); 
repeat s :=socket.recevtext; 
until timeout or length(s)>0; 
當然

你需要檢查,如果s是完整的數據包左右。