Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.09.12;
Скачать: CL | DM;

Вниз

TClientSocket в DLL   Найти похожие ветки 

 
GanibalLector ©   (2010-06-17 00:49) [0]

Делал сегодня OLE библиотеку и возник вопрос.
Вот, смотрите, так все работает :


type
 TInd = class(TAutoObject, IInd)
 private
   FHost:String;
 protected
   ...
   procedure Start; safecall;
   ...
 end;

implementation

uses ComServ,Windows;

var Sock:TClientSocket;

...

procedure TInd.Start;
begin
 Sock.Address:=FHost;
 Sock.Port:=3107;
 Sock.ClientType:=ctNonBlocking;
 Sock.Open;
end;

...

initialization
 TAutoObjectFactory.Create(ComServer, TInd, Class_Ind, ciMultiInstance, tmSingle);
 Sock:=TClientSocket.Create(nil);
finalization
 Sock.Free;
end.


А вот так, ни бильмеса не работает:


type
 TInd = class(TAutoObject, IInd)
 private
   Sock:TClientSocket;
   FHost:String;
 protected
   ...
   procedure Start; safecall;
   ...
 end;

...

procedure TInd.Start;
begin
 Sock:=TClientSocket.Create(nil);
 Sock.Address:=FHost;
 Sock.Port:=3107;
 Sock.ClientType:=ctNonBlocking;
 Sock.Open;
end;

...

initialization
 TAutoObjectFactory.Create(ComServer, TInd, Class_Ind, ciMultiInstance, tmSingle);
end.


Почему? Объясните убогому.

Спасибо!

З.Ы. Если не ошибаюсь, то когда-то видел ветку о том, что нельзя использовать TClientSocket в библиотеках и OLE. Или в параметре TClientSocket.Create(nil) nil нельзя использовать.


 
Сергей М. ©   (2010-06-17 09:16) [1]


> нельзя использовать TClientSocket в библиотеках и OLE. Или
> в параметре TClientSocket.Create(nil) nil нельзя использовать.
>


Ересь.


> Объясните убогому


Почему бы "убогому" для начала не объяснить что значит "ни бильмеса не работает" ?)


 
программер   (2010-06-17 10:12) [2]


> "ни бильмеса не работает" ?)

бильмес - не знать.


 
GanibalLector ©   (2010-06-17 11:24) [3]

2 Сергей М. ©   (17.06.10 09:16) [1]

>Ересь.

Вот, нашел. Между прочим, там Ваше высказывание. См [7]
http://delphimaster.net/view/6-1240921108/


 
Сергей М. ©   (2010-06-17 11:28) [4]


> GanibalLector ©   (17.06.10 11:24) [3]


И что ?
Где там сказано про "нельзя" ?


 
GanibalLector ©   (2010-06-17 11:33) [5]

2 Сергей М. ©   (17.06.10 09:16) [1]
>Почему бы "убогому" для начала не объяснить что значит "ни бильмеса не работает" ?)

Объясняю. Сокет создается, но процедура Sock.Open не приводит к желаемому результату. Если после выполнения Sock.Open  посмотреть состояние сокета Sock.Active, то можно увидеть, что там False.


 
GanibalLector ©   (2010-06-17 11:37) [6]

2 Сергей М. ©   (17.06.10 11:28) [4]
>Где там сказано про "нельзя" ?

Согласен. Там не написано, что нельзя. Пардон.
Там написано, что "Чтобы этот механизм работал, нужен цикл ожидания-выборки-диспетчеризации оконных сообщений в том же потоке, который выполнил метод TClientSocket.Open."

В моей библиотеке тоже нет "цикла ожидания-выборки-диспетчеризации оконных сообщений". Я даже не пойму о чем речь. Подскажите, лучше примером.

Спасибо!


 
Сергей М. ©   (2010-06-17 11:38) [7]


> после выполнения Sock.Open  посмотреть состояние сокета
> Sock.Active, то можно увидеть, что там False


Ну все правильно, так и должно быть для неблок.режима)
Как раз та самая ситуация, о которой я говорил в постах [7], [9] по приведенной тобой ссылке.


 
Сергей М. ©   (2010-06-17 11:39) [8]


> даже не пойму о чем речь


Не проще ли будет воспользоваться блок.режимом ?


 
GanibalLector ©   (2010-06-17 11:45) [9]

2 Сергей М. ©   (17.06.10 11:39) [8]


> Не проще ли будет воспользоваться блок.режимом ?


Проще. Но я хочу все знать. Если не затруднит - расскажите(покажите минимальным примером).


 
Сергей М. ©   (2010-06-17 11:54) [10]

var
 Msg: TMsg;
..

ClientSocket.Open;
while not ClientSocket.Active do begin
 if PeekMessage(Msg, 0, CM_SOCKETMESSAGE, CM_LOOKUPCOMPLETE, PM_REMOVE) then
 DispatchMessage(Msg);
Sleep(0);
end;


Вряд ли он тебе поможет.


 
Вариант   (2010-06-17 12:14) [11]


> GanibalLector ©   (17.06.10 11:37) [6]


> В моей библиотеке тоже нет "цикла ожидания-выборки-диспетчеризации
> оконных сообщений". Я даже не пойму о чем речь. Подскажите,
>  лучше примером

Речь о том, что сокет может быть настроен на разные схемы работы.
TClientSocket из "множества" схем использует только два, в зависимости от
ClientType. Это блокирующий режим - вызвал операцию(функцию) работы с сокетом -пока она не завершилась, функция не вернет результат - поток блокирован. И не блокирующий режим в варианте AsyncSelect - вызов функции  работы с сокетом не блокирует работу потока, а сразу возвращает управление, но сама вызванная операция может быть не завершена и уведомление о завершении ее работы прийдет позже. AsyncSelect подразумевает, что уведомление передается с помощью оконных сообщений. Если есть желание знать подробней - ищи литературу по работе с сетями, смотри  код реализации в исходниках дельфи, почитай справку MSDN по WSAAsyncSelect например.



Страницы: 1 вся ветка

Текущий архив: 2010.09.12;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.011 c
15-1276680436
xayam
2010-06-16 13:27
2010.09.12
Сколько сфер на каждом уровне?


2-1276788915
RET
2010-06-17 19:35
2010.09.12
Помогите с передачей строкового аргумента


15-1274256143
12
2010-05-19 12:02
2010.09.12
Помогите пропатчить dll. Обход ошибочного кода. Не взлом!


2-1276534233
akosh12345
2010-06-14 20:50
2010.09.12
Вывод кнопок динамически


15-1276584640
Неокубинец
2010-06-15 10:50
2010.09.12
Автоматизированный загрузчик