我正在努力在 C# 中调用 WinAPI SHAssocEnumHandlers。
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)”
堆栈跟踪显示了例外情况
System.StubHelpers.InterfaceMarshaler.ConvertToManaged(IntPtr pUnk, IntPtr itfMT, IntPtr classMT, Int32 flags)
我想我可能错过了一些实现。但我不知道是什么。
更新 1
此错误仅在 Windows 7 上发生。在 Windows 10 机器上它工作正常。(在各种win7和win10机器上测试过)