From bc534cdc5ae5e717c565ccb0e311699b90f5ca8b Mon Sep 17 00:00:00 2001 From: Vladimir Date: Wed, 26 Aug 2026 09:57:01 +0300 Subject: [PATCH] =?UTF-8?q?fix(web):=20win64-=D1=81=D0=B1=D0=BE=D1=80?= =?UTF-8?q?=D0=BA=D0=B0=20=D0=BF=D0=B0=D0=B4=D0=B0=D0=BB=D0=B0=20=D0=BD?= =?UTF-8?q?=D0=B0=20LoadLibrary=20=D1=81=20=D0=B8=D0=BC=D0=B5=D0=BD=D0=B5?= =?UTF-8?q?=D0=BC-=D1=81=D1=82=D1=80=D0=BE=D0=BA=D0=BE=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit В WebServer подключён юнит Windows (ради WinSock2), а он перекрывает dynlibs.LoadLibrary своим WinAPI, который принимает PChar. Пока имя библиотеки было строковой КОНСТАНТОЙ, приведение делал компилятор, и это не всплывало; как только имён стало несколько и они переехали в массив AnsiString (7a8dad3), win64-сборка легла: «Incompatible type for arg no. 1: Got "AnsiString", expected "PChar"». У остальных наших загрузчиков (AudioOutput, IIOBindings, DMRBindings) юнита Windows в uses нет — там тот же код собирается. Под Windows имя приводится явно, на Unix вызов остаётся прежним. Проверено пробником поверх заглушки юнита Windows из test/platform/win_stub (в неё для этого добавлены сигнатуры LoadLibrary/GetProcAddress/FreeLibrary): старая форма даёт ровно ту же ошибку, что и сборочная машина, новая компилируется. Сам WebServer стенд пока не проверяет — для этого нужна ещё заглушка WinSock2. --- WebServer.pas | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/WebServer.pas b/WebServer.pas index 9781ffe..5d53b21 100644 --- a/WebServer.pas +++ b/WebServer.pas @@ -792,7 +792,15 @@ begin Result := False; for i := 0 to High(OPUS_LIBS) do begin + // ★Здесь LoadLibrary — НЕ тот, что в остальных наших загрузчиках: юнит + // Windows (подключён ради WinSock2) перекрывает dynlibs своим WinAPI, а он + // берёт PChar, и AnsiString ему не подходит. Раньше это не всплывало — + // передавалась строковая КОНСТАНТА, она приводится сама. + {$IFDEF WINDOWS} + FOpusLib := LoadLibrary(PChar(OPUS_LIBS[i])); + {$ELSE} FOpusLib := LoadLibrary(OPUS_LIBS[i]); + {$ENDIF} if FOpusLib <> 0 then Break; end; if FOpusLib = 0 then Exit;