fix(dxcluster): сборка под win64 — Windows.pas перекрывал TCriticalSection

Сборщик под win64 падал в конструкторе клиента кластера: «identifier idents no
member Create». Windows.pas объявляет TCriticalSection как ЗАПИСЬ (алиас
TRTLCriticalSection), а в uses он стоял ПОСЛЕ SyncObjs — и поле FLock, и
TCriticalSection.Create разрешались в запись. На Linux эта ветка uses не
компилируется вовсе, поэтому баг жил с первого коммита DX-кластера (a2fdc3a)
и всплыл на первой же сборке под Windows.

Windows.pas убран из uses совсем: сокетам он не нужен, всё даёт WinSock2 —
так же сделано в WsClient (там тоже FLock: TCriticalSection) и HPSDRNetwork.
Причина подтверждена минимальным репро, дающим дословно тот же текст ошибки.

Сверено по исходнику winsock2.pp (FPC 3.2.2), чтобы следующая итерация
сборщика не встала на следующем имени: connect/socket/select/getsockopt/
setsockopt/FD_SET/FD_ZERO/WSAStartup/WSACleanup/inet_addr/gethostbyname/htons,
типы TWSAData/TSockAddrIn/TFDSet/TTimeVal/PHostEnt и константы INADDR_NONE/
SOL_SOCKET/SO_ERROR/SO_KEEPALIVE/WSAE* — все на месте. Указательная форма
connect(@Addr, …) тоже корректна: в winsock2 есть обе перегрузки.

Заодно FNV-хэш подписи набора спотов обёрнут в {$Q-}{$R-}: он живёт
переполнением, а проверки правятся в .lpi (в Release их сейчас нет).
Порядок «Windows после SyncObjs» проверен по всему проекту — больше нигде.

Сборка ewsdr (--ws=qt6) и ewsdrd — ОК, тест бэндплана зелёный. Win64 проверит
сборщик.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-14 18:32:59 +03:00
co-authored by Claude Opus 5
parent d12d8239da
commit 84f710476f
2 changed files with 11 additions and 2 deletions
+6 -1
View File
@@ -30,8 +30,13 @@ uses
Classes, SysUtils, SyncObjs, StrUtils, DateUtils,
WebUtils, // SockClose/SockShutdown/SockRecv/SockSend/SOCK_INVALID
DXSpotStore
// ★ Windows.pas здесь НЕТ намеренно: он объявляет TCriticalSection как
// ЗАПИСЬ (алиас TRTLCriticalSection) и, стоя в uses после SyncObjs,
// перекрывал класс — под win64 сборка падала на TCriticalSection.Create
// («identifier idents no member Create»). Всё, что нужно сокетам, даёт
// WinSock2; так же сделано в WsClient и HPSDRNetwork.
{$IFDEF MSWINDOWS}
, Windows, WinSock2
, WinSock2
{$ELSE}
, BaseUnix, Sockets, netdb
{$ENDIF};