Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Посылка сообщения внутри DLL. [D7, XP]


Новичек ©   (2008-07-11 09:29:00) 

Уважаемые Мастера, здравствуйте.
В своей программе я посылал сообщение таким образом:

WSAAsyncSelect(WorkedSocket, frmMain.Handle, WM_Any, FD_Read);

Т.е. сообщение посылается главной форме. Решил я код перенести в DLL, а кому теперь посылать сообщение? Прошу прощения за, возможно, ламерский вопрос.
Спасибо.


Сергей М.   (2008-07-11 14:51:00) [1]


> посижу, попытаюсь поправить, чтобы код был покрасивее


Тут не "поправлять" надобно, а полностьюего переписывать !


Новичек   (2008-07-11 14:36:00) [2]

В общем, я и не претендовал на нечто большее :-)
Сейчас посижу, попытаюсь поправить, чтобы код был покрасивее :-)


Сергей М.   (2008-07-11 14:32:00) [3]

Оцениваю на удовлетворительно с минусом)

Код безобразный по всем статьям - как по серьезным ошибкам в логике, так и по оформлению .. Не говоря уже о переносимости на другие платформы, если о них речь все же идет ..


Новичек   (2008-07-11 14:26:00) [4]


> Сергей М.

Обманул. Порылся в исходниках - делал ведь года 2 назад, работало.
Что-то типа этого:

pEvent := WSACreateEvent();

 FillChar(vSockAddr, SizeOf(TSockAddr), 0);
 vSockAddr.sin_family := AF_INET;
 vSockAddr.sin_port := htons(5000);
 vSockAddr.sin_addr.S_addr := inet_addr('10.42.1.47');

 vSocket := WinSock2.Socket(AF_INET, SOCK_STREAM, IPPROTO_IP);

 if vSocket = INVALID_SOCKET then Halt(1);
 WSAEventSelect(vSocket, pEvent, FD_READ);

 repeat
   WinSock2.Connect(vSocket, @vSockAddr, SizeOf(vSockAddr));
 until ConnectError <> 10035;

 if ConnectError = SOCKET_ERROR then Halt(1);

 WSAWaitForMultipleEvents(1, @pEvent, FALSE, WSA_INFINITE, FALSE);
 WSAResetEvent(pEvent);
 Recv(vSocket, aBuf_MGAAR, SizeOf(aBuf_MGAAR), 0);

 WSAWaitForMultipleEvents(1, @pEvent, FALSE, WSA_INFINITE, FALSE);
 WSAResetEvent(pEvent);
 repeat
   Recv(vSocket, aBuf_MGAAR, SizeOf(aBuf_MGAAR), 0);
 until Pos('<', aBuf_MGAAR) <> 0;


Как Вы оцениваете этот код? Может, что не так? Это мой первый опыт по программированию сокетов подобным образом.


Сергей М.   (2008-07-11 14:16:00) [5]

А то не ровен час придется мигрировать на другую платформу, где этих самых "окон" и в помине нет, но сокеты там при этом как-то умудряются и без "окон" обходиться)


Сергей М.   (2008-07-11 14:14:00) [6]

В самую пору будет столкнуться)

А то тебя основательно заклинило на окнах)


Новичек   (2008-07-11 14:02:00) [7]


> Сергей М.

А с этим я ввобще не сталкивался :-(


Сергей М.   (2008-07-11 13:53:00) [8]

А чем не угодила WSAEventSelect ? Или вообще блокирующий режим ? Или неблокирующий, но без нотификаций ?


Новичек   (2008-07-11 12:59:00) [9]


> Сергей М.

Всё, дошло наконец-то :-) Спасибо огромное.


Сергей М.   (2008-07-11 12:09:00) [10]

Не только это но и в том числе и в первую очередь.

Еще надо всерьез задуматься о том, где, в каком месте кода того или иного модуля (в составе твоего приложения), каким образом и при каких условиях будет осуществляться выборка и диспетчеризацияоконных сообщений, в результате чего собственно и будет вызываться этот самый WindowProc..


Новичек   (2008-07-11 11:47:00) [11]


> Точно так же как в каком-либо ином модуле

Если я правильно понял, необходимо создать окно и в функции WindowProc всё обработать?


Сергей М.   (2008-07-11 11:28:00) [12]


> как обработать ивенты от сокета в DLL?


Точно так же как в каком-либо ином модуле


Новичек   (2008-07-11 11:12:00) [13]


> Тогда зачем что-то посылать?

Необходимо обработать ивенты от сокета.


> Сергей М.

Это я понимаю. Но как обработать ивенты от сокета в DLL?


Сергей М.   (2008-07-11 10:21:00) [14]


> я посылал сообщение таким образом:
>
> WSAAsyncSelect


Ничего и никого ты не "посылал" таким образом - у этой ф-ции иная задача, хотя она действительно имеет прямое отношение к нотификации посредством оконных сообщений.


> формы нет


На форме свет что ли клином сошелся ?

Нужно окно ? Возьми да создай его вызовом AllocateHwnd(). Только не забудь его вовремя уничтожить - DeallocateHwnd()


Dennis I. Komarov   (2008-07-11 09:43:00) [15]

> А сейчас формы нет

Тогда зачем что-то посылать?


Новичек   (2008-07-11 09:40:00) [16]


> А вот это что?

Это было в проге. А сейчас формы нет.


Dennis I. Komarov   (2008-07-11 09:34:00) [17]

> frmMain.Handle

А вот это что?


Наверх

Титульная страница Поиск, карта сайта Написать письмо