![]() |
|
|
#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! |