This code to retrieve installed codecs finds different codecs depending on whether "Prefer 32-bit" is checked. Why?

55 Views Asked by At

I have this code that returns a list of installed video compressor codecs:

public static List<string> GetInstalledVideoCompressorCodecs()
{
    var codecs = new List<string>();
    var filterCategory = FilterCategory.VideoCompressorCategory;
    IMoniker[] monikers = new IMoniker[1];

    // Get a system device enumerator
    var devEnum = (ICreateDevEnum)new CreateDevEnum();

    // Enumerate the video codecs installed on the system
    devEnum.CreateClassEnumerator(filterCategory, out IEnumMoniker monikerEnum, 0);
    while (monikerEnum.Next(1, monikers, IntPtr.Zero) == 0)
    {
        monikers[0].GetDisplayName(null, null, out string codecName);

        // Add the codec name to the list
        codecs.Add(codecName);
    }

    return codecs;
}

However, depending on whether Prefer 32-bit in Project Properties > Build > General is checked, I get either:

u/device:dmo:{7E320092-596A-41B2-BBEB-175D10504EB6}{33D9A760-90C8-11D0-BD43-00A0C911CE86}

u/device:dmo:{D23B90D0-144F-46BD-841D-59E4EB19DC59}{33D9A760-90C8-11D0-BD43-00A0C911CE86}

u/device:dmo:{F7FFE0A0-A4F5-44B5-949E-15ED2BC66F9D}{33D9A760-90C8-11D0-BD43-00A0C911CE86}

u/device:sw:{33D9A760-90C8-11D0-BD43-00A0C911CE86}\DV Video Encoder

u/device:sw:{33D9A760-90C8-11D0-BD43-00A0C911CE86}\MJPEG Compressor

u/device:cm:{33D9A760-90C8-11D0-BD43-00A0C911CE86}\cvid

u/device:cm:{33D9A760-90C8-11D0-BD43-00A0C911CE86}\i420

u/device:cm:{33D9A760-90C8-11D0-BD43-00A0C911CE86}\iyuv

u/device:cm:{33D9A760-90C8-11D0-BD43-00A0C911CE86}\mrle

u/device:cm:{33D9A760-90C8-11D0-BD43-00A0C911CE86}\msvc

u/device:cm:{33D9A760-90C8-11D0-BD43-00A0C911CE86}\xvid

if it's checked, or

u/device:dmo:{7E320092-596A-41B2-BBEB-175D10504EB6}{33D9A760-90C8-11D0-BD43-00A0C911CE86}

u/device:dmo:{D23B90D0-144F-46BD-841D-59E4EB19DC59}{33D9A760-90C8-11D0-BD43-00A0C911CE86}

u/device:dmo:{F7FFE0A0-A4F5-44B5-949E-15ED2BC66F9D}{33D9A760-90C8-11D0-BD43-00A0C911CE86}

u/device:sw:{33D9A760-90C8-11D0-BD43-00A0C911CE86}\DV Video Encoder

u/device:sw:{33D9A760-90C8-11D0-BD43-00A0C911CE86}\ffdshow video encoder

u/device:sw:{33D9A760-90C8-11D0-BD43-00A0C911CE86}\MJPEG Compressor

if it's not checked. Why the difference?

1

There are 1 best solutions below

0
StefanFFM On

Depending on whether your application runs in 32-bit or 64-bit mode, it will load registered components from either the

HKEY_LOCAL_MACHINE\SOFTWARE\Classes

or

HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Classes

(I'm guessing this is where your codecs are registerd - please verify). Which makes sense too, since a 32-bit app can't load a 64-bit native dll and vice versa.