![]() |
|
#1
|
||||
|
||||
![]() Решил законнектить клиентсеую прогу с серверной при помощи TSocketConnection.
Пока вместе с серверной прогой запущен ScktSrvr.exe, всё работает отлично. Но я решил от ScktSrvr.exe избавиться. Покопался в DelphiWorld, нашёл там компонент TSocketDispatcher. Кинул его на форму, сделал Active:=True; порт присвоил 211. Скомпилил, запустил, а клиент с ним не коннектится. При этом сервер выдаёт сообщение об ошибке: "Access violation at address 00000000. Read of address 00000000." Кто-нибудь знает, как этот косяк исправить? Если ты чего-то не знаешь, значит есть шанс научиться чему-то новому Последний раз редактировалось Klassenas, 16.04.2012 в 21:40. |
#2
|
||||
|
||||
![]() Как я понял, этот компонент дублирует код из исходников ScktSrvr.exe.
Ошибка возникает в процедуре TSocketDispatcherThread.ClientExecute, в строке Event := FTransport.GetWaitEvent, при этом вызывается метод TSocketTransport.GetWaitEvent, находящийся в модуле SConnect.pas, где и происходит сбой при выполнении комады FEvent := WSACreateEvent; Причём WSACreateEvent объявлена как переменная типа функция и значение ей присваивается в LoadWinSock2 из модуля SConnect. Поставив брэйкпоинты в методе LoadWinSock2, я не заметил, чтобы он был вызван. По ходу он не вызывается, переменная остаётся пустой, и при попытке к ней обратиться и возникает тот самый Access Violation. Теперь вот думаю, как от этой ошибки избавиться. Буду признателен, если кто-нибудь поможет думать. Если ты чего-то не знаешь, значит есть шанс научиться чему-то новому |
#3
|
||||
|
||||
![]() Решение оказалось простым, как 3 рубля:
В методе TSocketDispatcherThread.ClientExecute перед строкой Event := FTransport.GetWaitEvent написал LoadWinSock2; В результате всё работает правильно, никаких ошибок не возникает! Выкладываю исправленный компонент. И никакого ScktSrvr.exe! Если ты чего-то не знаешь, значит есть шанс научиться чему-то новому |