Почему некоторые DLL с задержкой загрузки сразу выгружаются с помощью FFMPEG? - PullRequest
0 голосов
/ 25 сентября 2018

Я собрал 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?И как мне это предотвратить?

...