diff --git a/DXClusterClient.pas b/DXClusterClient.pas index a2d6fcc..ce5be8b 100644 --- a/DXClusterClient.pas +++ b/DXClusterClient.pas @@ -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}; diff --git a/DXSpotOverlay.pas b/DXSpotOverlay.pas index 97f0b22..c64b3cf 100644 --- a/DXSpotOverlay.pas +++ b/DXSpotOverlay.pas @@ -339,16 +339,20 @@ begin HiHz := FCenterFreq + FSpanHz / 2; FArrN := FStore.SnapshotRange(LoHz, HiHz, FModes, FMaxAgeMin, FArr); + // Хэш живёт переполнением — проверки снимаем локально, чтобы сборка с + // {$Q+}/{$R+} (у нас их нет, но режимы правятся в .lpi) не падала на нём. + {$PUSH}{$Q-}{$R-} H := (FNV_BASIS_HI shl 32) or FNV_BASIS_LO; // FNV-1a 64 for i := 0 to FArrN - 1 do begin for k := 1 to Length(FArr[i].Call) do H := (H xor QWord(Ord(FArr[i].Call[k]))) * FNV_PRIME; H := (H xor QWord(Round(FArr[i].FreqHz))) * FNV_PRIME; - H := (H xor QWord(Ord(FArr[i].Mode))) * FNV_PRIME; H := (H xor QWord(Round(FArr[i].Stamp * 86400))) * FNV_PRIME; + H := (H xor QWord(Ord(FArr[i].Mode))) * FNV_PRIME; end; FArrStamp := Int64(H); + {$POP} end; procedure TDXSpotOverlay.Layout(C: TCanvas; W: Integer);