Почему некоторые DLL с задержкой загрузки сразу выгружаются с помощью FFMPEG?

Я собрал ffmpeg как DLL и связал их с моим приложением, которое прекрасно работает, когда DLL находятся в исполняемой папке. Поскольку я хотел бы загружать разные сборки ffmpeg для разных конфигураций проекта, мне нужно поместить их в другие папки, отличные от .exe (например, «/ bin / ffmpeg / config1», «/ bin / ffmpeg / config2» и т. Д.). Единственный способ, которым я знаю, как сделать это без изменения среды PATH, — пометить библиотеки DLL как «задержку загрузки», а затем указать полный путь через вызовы LoadLibrary при запуске.

Это отлично работает для других библиотек DLL, но для FFMPEG у меня возникают проблемы с его правильной работой.

Я указал библиотеки DLL для DelayLoad в моем vcxproj (на самом деле в связанном файле .props):

  <DelayLoadDLLs>
avcodec-58.dll;avutil-56.dll;avformat-58.dll;swscale-5.dll;swresample-3.dll;
</DelayLoadDLLs>

И при запуске я загружаю их через LoadLibrary:

LoadLibraryA("ffmpeg\\config1\\avcodec-58.dll");
LoadLibraryA("ffmpeg\\config1\\avutil-56.dll");
LoadLibraryA("ffmpeg\\config1\\avformat-58.dll");
LoadLibraryA("ffmpeg\\config1\\swscale-5.dll");
LoadLibraryA("ffmpeg\\config1\\swresample-3.dll");

Странно то, что когда я делаю вызовы LoadLibrary, кажется, что они загружаются, а затем разгрузка некоторые из них сразу:

'ffmpegtest.exe' (Win32): Loaded 'C:\ffmpegtest\bin\ffmpeg\medium\avcodec-58.dll'. Symbols loaded.
'ffmpegtest.exe' (Win32): Unloaded 'C:\ffmpegtest\bin\ffmpeg\medium\avcodec-58.dll'
'ffmpegtest.exe' (Win32): Loaded 'C:\ffmpegtest\bin\ffmpeg\medium\avutil-56.dll'. Symbols loaded.
'ffmpegtest.exe' (Win32): Loaded 'C:\ffmpegtest\bin\ffmpeg\medium\avformat-58.dll'. Symbols loaded.
'ffmpegtest.exe' (Win32): Unloaded 'C:\ffmpegtest\bin\ffmpeg\medium\avformat-58.dll'
'ffmpegtest.exe' (Win32): Loaded 'C:\ffmpegtest\bin\ffmpeg\medium\swscale-5.dll'. Symbols loaded.
'ffmpegtest.exe' (Win32): Loaded 'C:\ffmpegtest\bin\ffmpeg\medium\swresample-3.dll'. Symbols loaded.

Таким образом, проблема ОПРЕДЕЛЕННО, кажется, связана с тем, что она решает выгрузить некоторые библиотеки. Если я не включаю какие-либо вызовы в LoadLibrary, то я получаю сбой в самой первой строке кода, вызывающей эти библиотеки, функцию в avutil-56.dll. Если я включаю вызовы LoadLibrary, то первые вызовы пары функций завершаются успешно, а затем мы терпим крах при первом вызове незагруженной библиотеки, в частности, «av_codec_iterate ()» в avcodec-58.dll. Если я скопирую выгруженные библиотеки DLL в исполняемую папку, то все работает нормально.

Почему некоторые из DLL выгружаются? И как мне это предотвратить?

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector