using System; using System.Runtime.InteropServices; using System.Runtime.InteropServices.ComTypes; namespace NaGet.InteropServices { /// /// COMをComInteropを経由せずにいじるための関数集 /// public sealed class ComDirectAccess { [DllImport("ole32.dll")] public static extern int CoInitialize(IntPtr pvReserved); [DllImport("ole32.dll")] public static extern void CoUninitialize(); [DllImport("ole32.dll", ExactSpelling=true, PreserveSig=false)] [return: MarshalAs(UnmanagedType.Interface)] static extern object CoCreateInstance( [In, MarshalAs(UnmanagedType.LPStruct)] Guid rclsid, [MarshalAs(UnmanagedType.IUnknown)] object pUnkOuter, CLSCTX dwClsContext, [In, MarshalAs(UnmanagedType.LPStruct)] Guid riid); [Flags()] public enum CLSCTX : uint { CLSCTX_INPROC_SERVER = 0x1, CLSCTX_INPROC_HANDLER = 0x2, CLSCTX_LOCAL_SERVER = 0x4, CLSCTX_INPROC_SERVER16 = 0x8, CLSCTX_REMOTE_SERVER = 0x10, CLSCTX_INPROC_HANDLER16 = 0x20, CLSCTX_RESERVED1 = 0x40, CLSCTX_RESERVED2 = 0x80, CLSCTX_RESERVED3 = 0x100, CLSCTX_RESERVED4 = 0x200, CLSCTX_NO_CODE_DOWNLOAD = 0x400, CLSCTX_RESERVED5 = 0x800, CLSCTX_NO_CUSTOM_MARSHAL = 0x1000, CLSCTX_ENABLE_CODE_DOWNLOAD = 0x2000, CLSCTX_NO_FAILURE_LOG = 0x4000, CLSCTX_DISABLE_AAA = 0x8000, CLSCTX_ENABLE_AAA = 0x10000, CLSCTX_FROM_DEFAULT_CONTEXT = 0x20000, CLSCTX_INPROC = CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER, CLSCTX_SERVER = CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER|CLSCTX_REMOTE_SERVER, CLSCTX_ALL = CLSCTX_SERVER|CLSCTX_INPROC_HANDLER, } /// /// 初期化禁止 /// private ComDirectAccess() { } /// /// COMオブジェクトを生成する。CoCreateInstanceのラッパメソッド /// /// オブジェクトのCLSID /// アグリゲートオブジェクト /// コンテキスト /// オブジェクトのIID /// 生成されたCOMオブジェクト public static object CreateInstance(Guid rclsid, object pUnkOuter, CLSCTX dwClsContext, Guid riid) { return CoCreateInstance(rclsid, pUnkOuter, dwClsContext, riid); } /// /// COMオブジェクトを生成する。COMオブジェクトの型はテンプレートTから自動取得・キャストされる。 /// /// オブジェクトのCLSID /// コンテキスト /// 生成されたCOMオブジェクト public static T CreateInstance(Guid clsid, CLSCTX dwClsContext) { Guid riid = new Guid(((GuidAttribute) Attribute.GetCustomAttribute(typeof(T), typeof(GuidAttribute))).Value); return (T) CreateInstance(clsid, null, dwClsContext, riid); } } }