/// <summary> /// The ID2D1Factory interface provides the starting point for Direct2D. /// In general, an object created from a single instance of a factory object can be used with other resources created from that instance, /// but not with resources created by other factory instances. /// </summary> /// <returns></returns> public static bool CreateD2DFactory(ID2D1Factory factory) { factory = null; object ppIFactory = null; int rc = Win32Error.S_OK; IntPtr ptrIID = IntPtr.Zero; GUID iid; if ((rc = OLE.IIDFromString(D2DInterfaceID.ID2D1Factory, out iid)) != Win32Error.S_OK) { logger.ErrorFormat("获取ID2D1Factory IID失败, guid = {0}, code = {1}", D2DInterfaceID.ID2D1Factory, rc); return(false); } try { ptrIID = Marshal.AllocHGlobal(Marshal.SizeOf(iid)); Marshal.StructureToPtr(iid, ptrIID, true); if ((rc = D2D1.D2D1CreateFactory(D2D1_FACTORY_TYPE.D2D1_FACTORY_TYPE_SINGLE_THREADED, ptrIID, IntPtr.Zero, out ppIFactory)) != Win32Error.S_OK) { logger.ErrorFormat("D2D1CreateFactory失败, code = {0}", rc); return(false); } } catch (Exception ex) { logger.Error("创建D2DFactory异常", ex); return(false); } finally { if (ptrIID != IntPtr.Zero) { Marshal.FreeHGlobal(ptrIID); } } factory = ppIFactory as ID2D1Factory; return(true); }