2 using System.Runtime.InteropServices;
\r
3 using System.Runtime.InteropServices.ComTypes;
\r
5 namespace NaGet.InteropServices
\r
8 /// COMをComInteropを経由せずにいじるための関数集
\r
10 public sealed class ComDirectAccess
\r
12 [DllImport("ole32.dll")]
\r
13 public static extern int CoInitialize(IntPtr pvReserved);
\r
15 [DllImport("ole32.dll")]
\r
16 public static extern void CoUninitialize();
\r
18 [DllImport("ole32.dll", ExactSpelling=true, PreserveSig=false)]
\r
19 [return: MarshalAs(UnmanagedType.Interface)]
\r
20 static extern object CoCreateInstance(
\r
21 [In, MarshalAs(UnmanagedType.LPStruct)] Guid rclsid,
\r
22 [MarshalAs(UnmanagedType.IUnknown)] object pUnkOuter,
\r
23 CLSCTX dwClsContext,
\r
24 [In, MarshalAs(UnmanagedType.LPStruct)] Guid riid);
\r
27 public enum CLSCTX : uint
\r
29 CLSCTX_INPROC_SERVER = 0x1,
\r
30 CLSCTX_INPROC_HANDLER = 0x2,
\r
31 CLSCTX_LOCAL_SERVER = 0x4,
\r
32 CLSCTX_INPROC_SERVER16 = 0x8,
\r
33 CLSCTX_REMOTE_SERVER = 0x10,
\r
34 CLSCTX_INPROC_HANDLER16 = 0x20,
\r
35 CLSCTX_RESERVED1 = 0x40,
\r
36 CLSCTX_RESERVED2 = 0x80,
\r
37 CLSCTX_RESERVED3 = 0x100,
\r
38 CLSCTX_RESERVED4 = 0x200,
\r
39 CLSCTX_NO_CODE_DOWNLOAD = 0x400,
\r
40 CLSCTX_RESERVED5 = 0x800,
\r
41 CLSCTX_NO_CUSTOM_MARSHAL = 0x1000,
\r
42 CLSCTX_ENABLE_CODE_DOWNLOAD = 0x2000,
\r
43 CLSCTX_NO_FAILURE_LOG = 0x4000,
\r
44 CLSCTX_DISABLE_AAA = 0x8000,
\r
45 CLSCTX_ENABLE_AAA = 0x10000,
\r
46 CLSCTX_FROM_DEFAULT_CONTEXT = 0x20000,
\r
47 CLSCTX_INPROC = CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER,
\r
48 CLSCTX_SERVER = CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER|CLSCTX_REMOTE_SERVER,
\r
49 CLSCTX_ALL = CLSCTX_SERVER|CLSCTX_INPROC_HANDLER,
\r
55 private ComDirectAccess()
\r
60 /// COMオブジェクトを生成する。CoCreateInstanceのラッパメソッド
\r
62 /// <param name="rclsid">オブジェクトのCLSID</param>
\r
63 /// <param name="pUnkOuter">アグリゲートオブジェクト</param>
\r
64 /// <param name="dwClsContext">コンテキスト</param>
\r
65 /// <param name="riid">オブジェクトのIID</param>
\r
66 /// <returns>生成されたCOMオブジェクト</returns>
\r
67 public static object CreateInstance(Guid rclsid, object pUnkOuter, CLSCTX dwClsContext, Guid riid)
\r
69 return CoCreateInstance(rclsid, pUnkOuter, dwClsContext, riid);
\r
73 /// COMオブジェクトを生成する。COMオブジェクトの型はテンプレートTから自動取得・キャストされる。
\r
75 /// <param name="clsid">オブジェクトのCLSID</param>
\r
76 /// <param name="dwClsContext">コンテキスト</param>
\r
77 /// <returns>生成されたCOMオブジェクト</returns>
\r
78 public static T CreateInstance<T>(Guid clsid, CLSCTX dwClsContext)
\r
80 Guid riid = new Guid(((GuidAttribute) Attribute.GetCustomAttribute(typeof(T), typeof(GuidAttribute))).Value);
\r
81 return (T) CreateInstance(clsid, null, dwClsContext, riid);
\r