Delphi DLL - события TClientSocket

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

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

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

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

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

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


person Cesar Romero    schedule 01.07.2010    source источник


Ответы (2)


вам, вероятно, понадобится цикл сообщений в вашей 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.

person G-Man    schedule 01.07.2010
comment
Я сделал это в основной процедуре DLL, и при первом взаимодействии DLL останавливается в GetMessage и не продвигается вперед. - person Cesar Romero; 01.07.2010
comment
Теперь я знаю, что GetMessage ждет, пока не получит сообщение, поэтому я перехожу на PeekMessage, но он возвращает -1, поэтому он гаснет. если я удалю тест, он никогда не загрузит приложение. - person Cesar Romero; 01.07.2010
comment
Цезарь, может быть, виноват в том, что приложение COBOL видит другой похожий поток (это .net, но, похоже, он решает ту же проблему) devnewsgroups.net/windowsforms/t10952-messageloop-thread.aspx - person G-Man; 01.07.2010
comment
GX, я думаю, решение будет заключаться в перемещении TClientSocket в поток внутри DLL, а затем добавлении цикла в метод выполнения. Теперь я работаю в синтаксическом анализаторе, чтобы текущая версия работала, и я начну новую версию, используя потоки. Я опубликую здесь результат, когда это будет сделано. Спасибо за вашу помощь. - person Cesar Romero; 05.07.2010

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

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

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

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

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

person melice    schedule 02.03.2012