![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Посылка сообщения внутри 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
А вот это что?