代码之家  ›  专栏  ›  技术社区  ›  David Brown Muad'Dib

为什么Direct2d和DirectWrite不使用传统的COM对象?

  •  4
  • David Brown Muad'Dib  · 技术社区  · 14 年前

    我在玩C_中的一个小二维游戏引擎,并决定使用Direct2d和DirectWrite进行渲染。我知道有Windows API代码包和SLIMDX,但我真的很想从头开始写一个接口。我试图在没有管理C++的情况下做它,但是DistT2D和DrWrRITE似乎没有使用传统的COM对象。它们定义了派生自 IUnknown 但似乎没有办法在C和COM互操作中实际使用它们。里面有IID d2d1.h ,但没有CLSID。

    当然,我对COM互操作非常陌生,所以我可能只是缺少了一些东西。有人能解释一下这种情况吗?

    3 回复  |  直到 14 年前
        1
  •  8
  •   David Brown Muad'Dib    14 年前

    知道了。不能直接创建对象,但是 d2d1.dll 包含一个名为的导出 D2D1CreateFactory 返回一个 ID2DFactory 接口。使用此,您可以实现没有托管C++的DistT2D包装器。

    public static class Direct2D1Util {
        public const string IID_ID2D1Factory =
            "06152247-6f50-465a-9245-118bfd3b6007";
    
        [DllImport("d2d1.dll", PreserveSig = false)]
        [return: MarshalAs(UnmanagedType.Interface)]
        private static extern object D2D1CreateFactory(D2D1_FACTORY_TYPE factoryType,
            [MarshalAs(UnmanagedType.LPStruct)] Guid riid,
            D2D1_FACTORY_OPTIONS pFactoryOptions);
    
        public static ID2D1Factory CreateFactory() {
            D2D1_FACTORY_OPTIONS opts = new D2D1_FACTORY_OPTIONS();
            object factory = D2D1CreateFactory(
                D2D1_FACTORY_TYPE.D2D1_FACTORY_TYPE_SINGLE_THREADED,
                new Guid(IID_ID2D1Factory), opts);
            return (ID2D1Factory)factory;
        }
    }
    

    我不包括所有类型,因为它们都在 d2d1.h ,但以下是如何使用代码获取工厂:

    ID2DFactory factory = Direct2D1Util.CreateFactory();
    

    确定你的 ID2工厂 接口具有适当的 Guid InterfaceType(ComInterfaceType.InterfaceIsIUnknown) 属性。

        2
  •  6
  •   Tim Lloyd    14 年前

    “Windows_API code pack for Microsoft_.NET Framework”具有允许访问Direct2d和DirectWrite的托管库。

    http://code.msdn.microsoft.com/WindowsAPICodePack

    更新

    虽然DirectX包装器是用托管C++编写的,但它们生成托管库。从外观上看,这些可以在C中使用。在下载中包含了大量的示例,这些示例恰好做到这一点,即使用来自C++的托管C++直接包装库。

    在我自己的C语言应用程序中使用Windows 7的特性会非常好,所以我现在安装了WINDOW7SDK(这样我就可以构建托管C++ DirectX解决方案),并且会让整个事情成为一个BASH。

    我按照指示在:

    http://blogs.msdn.com/msaleh/archive/2009/08/25/introducing-directx-features-of-windows-api-code-pack.aspx

    更新2

    按照上面链接的说明,我得到了管理C++库的编译,你可以很容易地使用它们。

    现在我不确定我是否理解正确,但您是在看使用C的direct2d和directwrite的方法,还是必须是com或p\invoke。

    我非常怀疑是否会有一个COM包装器,因为它是一个不匹配的技术。COM并不是为你在图形编程中得到的那种高频方法调用模式而设计的——它太慢了。

    如果您真的想执行p\invoke,您可以始终查看directx头文件(在Windows7sdk中),并使用工具创建所有p\invoke调用存根,例如

    http://www.pinvoker.com/

    不过,用这种方式开发包装器可能是一个主要的PITA。

        3
  •  2
  •   Tor Haugen    14 年前

    有一个关于codeplex的项目为direct2d提供了托管包装器。我不知道它是否有任何好处,但很可能源代码会帮助您开始。

    http://direct2dsharp.codeplex.com/

    推荐文章