1

TClientSocket コンポーネントを含む DLL があります。これは、電話システム マシンと通信するために使用されます。DLL は、エクスポート メソッドに PChar パラメーターのみを持ち、パッケージを使用していません。

Delphi アプリで DLL をロードすると、すべてのイベントが正常に機能し、今のところ問題はありません。

私の顧客はコンソールの Win32 Cobol プログラムからこの DLL を呼び出していますが、TClientSocket はイベントが発生してもイベントをトリガーしません。メイン ループを使用して DLL のチェック メソッドを呼び出し、電話システムからの戻りがあるかどうかを確認します。 OK を返し、Get メソッドを呼び出すと、ここで問題が発生します。

TClientSocket.OnRead イベントで、TClientSocket.Socket.ReceiveText を呼び出します。サーバー アプリからいくつかの戻り値があります。このイベントは、DLL からメソッドを呼び出したときにのみトリガーされ、TClientSocket はいくつかの戻り値を保持していると思います。バッファ。

問題は、この Return を分割する Delimiter が見つからないことです。

どうすればこれを修正できますか? OnRead イベントが Delphi プログラムから呼び出されていないときに毎回トリガーされるようにするために、DLL に追加できるものはありますか?

4

2 に答える 2

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

于 2010-07-01T15:54:16.183 に答える
0

最近、私はあなたと同様の問題に遭遇しました.dllの私のclientsocketはdelphi-exeでは正常に動作しますが、c-console exeでは動作しませんtclientsocket.メッセージループを処理するためにメインスレッドを必要とするselect-eventモードを使用していることを思い出しました. 、 それで 、

dll で非ブロック モードの tclientsocket を使用している場合、ホストはメイン スレッドをブロックしてはならず、メッセージ ループを実行する必要があります (たとえば、コンソール プログラムで呼び出す場合)。

ホストコードを変更できない場合があります(私が遭遇したケース)、次のようにすることができます

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

もちろん、s が完全なパケットかどうかを確認する必要があります。

于 2012-03-02T13:06:33.617 に答える