libopus.dll собирается кросс-компилятором mingw-w64, а opus по умолчанию
включает защиту стека (OPUS_STACK_PROTECTOR → -fstack-protector-strong).
В mingw эта защита живёт в отдельной библиотеке, поэтому в импортах DLL стоит
libssp-0.dll, и без неё LoadLibrary возвращает «модуль не найден» — жалуясь на
ЗАВИСИМОСТЬ, а не на саму libopus. Снаружи это выглядит как «библиотека лежит
рядом с exe, а её не видят»: ровно на это и напоролись.
Проверено разбором заголовков самой DLL: PE32+ x86-64 (разрядность верная),
экспорт полный, импорт — KERNEL32.dll, msvcrt.dll и libssp-0.dll.
Альтернатива — собирать opus с -DOPUS_STACK_PROTECTOR=OFF и не таскать файл;
выбран вариант с DLL, чтобы у кодека, который разбирает присланное браузером,
защита стека осталась.
Web-интерфейс кодирует звук в Opus и декодирует им же микрофон браузера,
а грузится библиотека динамически (LoadLibrary в WebServer.LoadOpus), поэтому
без DLL рядом с ewsdr.exe web оставался немым — теперь на странице об этом
хотя бы честно написано, но саму библиотеку надо ещё и доставить.
Without it Inno Setup skips files whose version matches the installed
one, so the exe was not replaced on updates.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>