Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Сети > Путаница с TSockAddr и PSockAddr


Автор: ASGDeveloper 22.8.2006, 21:55
Есть у меня два заголовочных файла - для WinSock и WinSock 2.
В одном для функции connect используется TSockAddr, во втором - PSockAddr.
Моя прога перехватывает запросы на соединение и перенаправляет трафик на порт-маппер. При модификации SockAddr для wsock32.dll работают оба варианта:
1) SockAddr._переменная_
2) SockAddr^._переменная_

Для ws2_32.dll - аналогично.

Почему?  smile

Автор: Snowy 23.8.2006, 00:25
PSockAddr, как видно из названия - это указатель на TSockAddr.
Просто физически варовские переменные - это указатель.
Поэтому, если для API функции создать описание с var, то нужно её передавать переменную, а не указатель - функция сама превратит его в указатель.
Если она без вара, то нужно передавать указатель.
Далее.
Если функция с варом, но передаём ей указатель, то он автоматически преобразуется компилятором в переменную. Поэтому можно указывать, как переменную, так и указатель на неё.
Подобное поведение компилятора широко используется в библиотеке KOL. В которой все объекты - это указатели, но обращение к ним идёт, как к переменным - компилятор автоматом перетранслирует это в "правильный" код.

Добавлено @ 00:28 
Пример:
TPoint.X идентично PPoint.X, хотя правильно было бы написать PPoint^.X.
Но компилятор распознаёт такое поведение и транслирует его, т.к. понимает, что обращение к полям указателя - нереально, и программист имел ввиду поле объекта/структуры, на которую указывает указатель.

Автор: ASGDeveloper 23.8.2006, 07:42
Большое спасибо за пояснение. Вопрос закрыт.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)