DirectShow AccessViolationException при загрузке фильтра

Имею код:

        public static int CreateDirectShowFilter(Guid guid, out IBaseFilter filter)
        {
            Type type = Type.GetTypeFromCLSID(guid);
            try
            {
                filter = (IBaseFilter)Activator.CreateInstance(type);
                return S_OK;
            }
            catch (AccessViolationException ex)
            {
                filter = null;
                return ex.HResult;
            }
            catch (Exception ex)
            {
                filter = null;
                return ex.HResult;
            }
        }

Если тыкать по кнопке, которая очищает и перестраивает граф, то довольно часто вылетает ошибка Попытка чтения или записи в защищенную память. Это часто свидетельствует о том, что другая память повреждена.. При этом, программа наворачивается, несмотря на catch.
Стэк вызовов показывает, что метод с ошибкой был вызван из метода, который перебирает сплиттеры. Но знание этого особо ничего не даёт :man_shrugging:

Ну серьезно … А какой совет то вы хотите услышать??

Даже студия вам сказала “Это часто свидетельствует о том, что другая память повреждена.”
Не видя кода ничего и не сказать. При каком гуиде ошибка вылазит? может фильтра такого нету??

А, ну всё понятно :man_facepalming: Другая память. Пошел смотреть память в другом компьютере.

{564fd788-86c9-4444-971e-cc4a243da150}
Haali media splitter (AR)

Ну и как его может не быть, если предыдущие 8 попыток прошли успешно, а на девятой оно накрылось? Ну вот как? :man_shrugging:

вот

и вот

Сейчас переделываю проект, пользуясь коммитами. Но код движка остался неизменным.

Так может не в этом месте?)
Что в стек трейсе?

Ничего интересного:

|>|Zeratool.exe!Zeratool_player_C_Sharp.DirectShowUtils.CreateDirectShowFilter(System.Guid guid, out DirectShowLib.IBaseFilter filter)Строка 60|C#|
|---|---|---|
| |Zeratool.exe!Zeratool_player_C_Sharp.ZeratoolPlayerEngine.FindAndConnectMediaSplitter_Manual(System.Collections.Generic.IEnumerable<Zeratool_player_C_Sharp.DirectShowUtils.FilterItem> splitters, DirectShowLib.IPin sourcePinOut)Строка 552|C#|
| |Zeratool.exe!Zeratool_player_C_Sharp.ZeratoolPlayerEngine.ConnectMediaSplitter_Manual(DirectShowLib.IPin sourcePinOut)Строка 537|C#|
| |Zeratool.exe!Zeratool_player_C_Sharp.ZeratoolPlayerEngine.BuildGraphManual()Строка 390|C#|
| |Zeratool.exe!Zeratool_player_C_Sharp.ZeratoolPlayerEngine.BuildGraph()Строка 342|C#|
| |Zeratool.exe!Zeratool_player_C_Sharp.ZeratoolPlayerEngine.Play()Строка 1160|C#|
| |Zeratool.exe!Zeratool_player_C_Sharp.ZeratoolPlayerGui.Play()Строка 186|C#|
| |Zeratool.exe!Zeratool_player_C_Sharp.Form1.PlayerHandleKeyboard(Zeratool_player_C_Sharp.ZeratoolPlayerGui controlledPlayer, System.Windows.Forms.KeyEventArgs e)Строка 96|C#|
| |Zeratool.exe!Zeratool_player_C_Sharp.Form1.Form1_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)Строка 60|C#|
| |[Внешний код]||
| |Zeratool.exe!Zeratool_player_C_Sharp.Program.Main()Строка 16|C#|

А это стэктрейс из окна вывода:

тут было 8 успешных попыток.
.....
Main form received player action: Play
File name: H:\Downloads\completed\Doctor.Who.S10.WEB-DLRip.BaiBaKo.TeamNotDead\Doctor.Who.S10E00.WEB-DLRip.BaiBaKo.TeamNotDead.mkv
Building graph in manual mode.
Automatic media splitter selection mode.
"Zeratool.exe" (CLR v4.0.30319: Zeratool.exe). Загружено "C:\Windows\Microsoft.Net\assembly\GAC_MSIL\mscorlib.resources\v4.0_4.0.0.0_ru_b77a5c561934e089\mscorlib.resources.dll". Сборка модуля выполнена без символов.
Вызвано исключение: "System.AccessViolationException" в Zeratool.exe
Необработанное исключение типа "System.AccessViolationException" в Zeratool.exe
Попытка чтения или записи в защищенную память. Это часто свидетельствует о том, что другая память повреждена.

"Zeratool.exe" (CLR v4.0.30319: Zeratool.exe). Загружено "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Common7\IDE\PrivateAssemblies\Runtime\Microsoft.VisualStudio.Debugger.Runtime.Desktop.dll". Загрузка символов пропущена. Модуль оптимизирован, включен параметр отладчика "Только мой код".

Необработанное исключение: System.AccessViolationException: Попытка чтения или записи в защищенную память. Это часто свидетельствует о том, что другая память повреждена.
   в Zeratool_player_C_Sharp.DirectShowUtils.CreateDirectShowFilter(Guid guid, IBaseFilter& filter) в H:\Projects\CSharp 2019\Zeratool player C Sharp\Zeratool player C Sharp\DirectShowUtils.cs:строка 60
   в Zeratool_player_C_Sharp.ZeratoolPlayerEngine.FindAndConnectMediaSplitter_Manual(IEnumerable`1 splitters, IPin sourcePinOut) в H:\Projects\CSharp 2019\Zeratool player C Sharp\Zeratool player C Sharp\ZeratoolPlayerEngine.cs:строка 552
   в Zeratool_player_C_Sharp.ZeratoolPlayerEngine.ConnectMediaSplitter_Manual(IPin sourcePinOut) в H:\Projects\CSharp 2019\Zeratool player C Sharp\Zeratool player C Sharp\ZeratoolPlayerEngine.cs:строка 537
   в Zeratool_player_C_Sharp.ZeratoolPlayerEngine.BuildGraphManual() в H:\Projects\CSharp 2019\Zeratool player C Sharp\Zeratool player C Sharp\ZeratoolPlayerEngine.cs:строка 390
   в Zeratool_player_C_Sharp.ZeratoolPlayerEngine.BuildGraph() в H:\Projects\CSharp 2019\Zeratool player C Sharp\Zeratool player C Sharp\ZeratoolPlayerEngine.cs:строка 342
   в Zeratool_player_C_Sharp.ZeratoolPlayerEngine.Play() в H:\Projects\CSharp 2019\Zeratool player C Sharp\Zeratool player C Sharp\ZeratoolPlayerEngine.cs:строка 1160
   в Zeratool_player_C_Sharp.ZeratoolPlayerGui.Play() в H:\Projects\CSharp 2019\Zeratool player C Sharp\Zeratool player C Sharp\ZeratoolPlayerGui.cs:строка 186
   в Zeratool_player_C_Sharp.Form1.PlayerHandleKeyboard(ZeratoolPlayerGui controlledPlayer, KeyEventArgs e) в H:\Projects\CSharp 2019\Zeratool player C Sharp\Zeratool player C Sharp\Form1.cs:строка 96
   в Zeratool_player_C_Sharp.Form1.Form1_KeyDown(Object sender, KeyEventArgs e) в H:\Projects\CSharp 2019\Zeratool player C Sharp\Zeratool player C Sharp\Form1.cs:строка 60
   в System.Windows.Forms.Control.OnKeyDown(KeyEventArgs e)
   в System.Windows.Forms.Control.ProcessKeyEventArgs(Message& m)
   в System.Windows.Forms.Form.ProcessKeyPreview(Message& m)
   в System.Windows.Forms.Control.ProcessKeyMessage(Message& m)
   в System.Windows.Forms.Control.WmKeyChar(Message& m)
   в System.Windows.Forms.Control.WndProc(Message& m)
   в System.Windows.Forms.ScrollableControl.WndProc(Message& m)
   в System.Windows.Forms.UserControl.WndProc(Message& m)
   в System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
   в System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
   в System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
   в System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
   в System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData)
   в System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
   в System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
   в System.Windows.Forms.Application.Run(Form mainForm)
   в Zeratool_player_C_Sharp.Program.Main() в H:\Projects\CSharp 2019\Zeratool player C Sharp\Zeratool player C Sharp\Program.cs:строка 16
Программа "[8524] Zeratool.exe" завершилась с кодом 0 (0x0).

Попробовал много раз вызывать эту процедуру отдельно - всё нормально.
Видимо, придётся комментировать участки кода и смотреть, когда пропадёт ошибка.
На Delphi часто приходилось так делать.
Подозреваю, что ошибка связана с пинами :thinking: В MSDN не нашел, надо их уничтожать или нет :man_shrugging: Я их уничтожаю, а, возможно, не надо :thinking:
FindAndConnectMediaSplitter_Manual(IEnumerable`1 splitters,
Интересно, что значит 1? :thinking:

А, да, оно ловится только если добавить HandleProcessCorruptedStateExceptions CLR Inside Out - Handling Corrupted State Exceptions | Microsoft Docs
Потому что обычно продолжат работу после такого — плохая идея. Надо разбираться чем вызвано и исправлять.

кол-во дженерик параметров. .net - In C# what is the meaning of 1 after IEnumerable in System.Collections.Generic.IEnumerable`1 - Stack Overflow

Кажется, ошибка найдена и исправлена. Я, случайно, освобождал не тот пин, который надо было.
Сделал коммит в новом проекте плеера, если кому-то, внезапно, интересно.