Вам также нужно запустить это в 64-битном режиме, чтобы получить все связанные приложения, так как запуск в 32-битном режиме не возвращает их все. По этой причине вам необходимо заменить эти вызовы, как указал @ SörenKuklau.

всех сил пытаюсь вызвать WinAPI SHAssocEnumHandlers в C #.

using System;
using System.Runtime.InteropServices;

namespace AssocHandlerTest
{
  [Flags]
  public enum ASSOC_FILTER
  {
    ASSOC_FILTER_NONE = 0x0,
    ASSOC_FILTER_RECOMMENDED = 0x1
  };

  [ComImport]
  [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
  [Guid("F04061AC-1659-4a3f-A954-775AA57FC083")]
  public interface IAssocHandler
  {
    int GetName([Out, MarshalAs(UnmanagedType.LPWStr)] out string ppsz);
    int GetUIName([Out, MarshalAs(UnmanagedType.LPWStr)] out string ppsz);
    int GetIconLocation([Out, MarshalAs(UnmanagedType.LPWStr)] out string ppszPath, [Out] out int pIndex);
    int IsRecommended();
    int MakeDefault([In, MarshalAs(UnmanagedType.LPWStr)] string pszDescription);
    int Invoke([In, MarshalAs(UnmanagedType.IUnknown)] object pdo);
    int CreateInvoker([In, MarshalAs(UnmanagedType.IUnknown)] object pdo, [Out, MarshalAs(UnmanagedType.IUnknown)] out object ppInvoker);
  };

  [ComImport]
  [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
  [Guid("973810ae-9599-4b88-9e4d-6ee98c9552da")]
  public interface IEnumAssocHandlers
  {
    int Next([In, MarshalAs(UnmanagedType.U4)] int celt, [Out, MarshalAs(UnmanagedType.Interface)] out IAssocHandler rgelt, [Out, MarshalAs(UnmanagedType.U4)] out int pceltFetched);
  };

  class Program
  {
    [DllImport("Shell32.dll", CharSet = CharSet.Auto)]
    static extern bool SHAssocEnumHandlers(
    [In, MarshalAs(UnmanagedType.LPWStr)] string pszExtra, [In] ASSOC_FILTER afFilter, [Out, MarshalAs(UnmanagedType.Interface)] out IEnumAssocHandlers ppEnumHandler);

    static void Main(string[] args)
    {
      const string extension = ".html";
      try
      {
        IEnumAssocHandlers enumAssocHandlers = null;
        SHAssocEnumHandlers(extension, ASSOC_FILTER.ASSOC_FILTER_NONE, out enumAssocHandlers);
      }
      catch (Exception ex)
      {
        Console.WriteLine(ex.Message);
      }
      Console.ReadLine();
    }
  }
}

При вызове SHAssocEnumHandlers я получаю только

«Неожиданная ошибка: HRESULT: 0x80004005 (E_FAIL)»

Stacktrace показывает исключение в

System.StubHelpers.InterfaceMarshaler.ConvertToManaged(IntPtr pUnk, IntPtr itfMT, IntPtr classMT, Int32 flags)

Я думаю, что, может быть, мне не хватает какой-то реализации. Но я не могу понять, что.

Обновление 1

Эта ошибка возникает только в Windows 7. На компьютере с Windows 10 она работает нормально. (Проверено на различных машинах win7 и win10)

Ответы на вопрос(1)

Ваш ответ на вопрос