Delphi DLL - события TClientSocket - PullRequest
1 голос
/ 01 июля 2010

У меня есть DLL с компонентом TClientSocket, он используется для связи с машиной телефонной системы.У DLL есть только параметры PChar в методах экспорта, и она не использует пакеты.

Когда я загружаю DLL с приложением Delphi, все события работают нормально, проблем пока нет.

Мойклиент вызывает эту DLL из консольной программы Win32 Cobol, и TClientSocket не запускает события, когда это происходит, он использует основной цикл для вызова метода проверки в DLL, чтобы узнать, есть ли какой-либо возврат из телефонной системы, если онвозвращает OK, затем вызывает метод Get, и вот где проблема возникает:

В событии TClientSocket.OnRead я вызываю TClientSocket.Socket.ReceiveText, и есть несколько возвратов из приложения сервера, что заставляет меня думатьчто событие вызывается только когда я вызываю метод из DLL, и TClientSocket удерживает несколько возвратов в буфере.

Проблема в том, что я не могу найти разделитель для разделения этого возврата.

Как я могу это исправить?Могу ли я что-нибудь добавить в свою DLL, чтобы убедиться, что событие OnRead будет запускаться каждый раз, когда оно не вызывается из программы Delphi?

Ответы [ 2 ]

2 голосов
/ 01 июля 2010

вам, вероятно, нужен цикл сообщений в вашей dll .. (Консольные приложения не имеют насоса сообщений ..). ТАК реализовать что-то вроде этого в вашем конструкторе 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 голосов
/ 02 марта 2012

недавно я столкнулся с такой же проблемой, как и вы, мой clientocket в dll работает нормально с delphi-exe, но не с c-console exe, и я вспомнил, tclientsocket использует режим select-event, который требует поток для обработки цикла сообщений, поэтому

если вы используете tclientsocket с неблокированным режимом в dll, хост НИКОГДА не должен блокировать основной поток и должен выполнять цикл обработки сообщений (например, при вызове в консольной программе).

иногда мы не можем изменить код хоста (случай, с которым я встречаюсь), тогда мы можем сделать так

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

конечно, вам нужно проверить, является ли s полным пакетом или около того.

...