【问题标题】:Getting bogus return values from C macros in Direct2D从 Direct2D 中的 C 宏获取虚假返回值
【发布时间】:2021-01-26 01:45:54
【问题描述】:

我正在使用 C 风格界面使用 Direct2D。除了返回结构的两个函数,即ID2D1Bitmap_GetSizeID2D1RenderTarget_GetSize 之外,这工作正常。它们返回一个 64 位的 D2D1_SIZE_F 结构(它包含两个 FLOAT 项)。我这样称呼他们:

D2D1_SIZE_F sz;
    
sz = ID2D1Bitmap_GetSize(pBitmap);
printf("GOT: %f %f\n", sz.width, sz.height);
    
sz = ID2D1RenderTarget_GetSize(pRenderTarget);
printf("GOT: %f %f\n", sz.width, sz.height);

我从两个GetSize 调用中都得到了虚假值,所以看起来在寄存器级别上有些东西搞砸了。有趣的是,似乎有人遇到了类似的问题 (see here),但他在使用 MinGW 和 C++,人们说这是一个 MinGW 问题。我不在 MinGW 上,但我在旧版本的 Visual C(15.00.30729.01 for x64)上,我不使用 C++,而是使用 C。

由于可能没有人使用 C 中的 Direct2D,我认为很可能其中一些桥接宏被搞砸了并且不能在 C 中工作。这可能是这种情况吗?有什么办法也可以从 C 中进行这项工作吗?

【问题讨论】:

  • 非常感谢!我已经破解了d2d1.h 以包含一个额外的指针参数,它确实解决了这个问题!这是否已在较新的 SDK 中修复?从 2012 年左右开始,我仍在使用 SDK。
  • SDK 团队正在努力解决这个问题,但我不确定修复是否已经完成。

标签: winapi direct2d


【解决方案1】:

仅作记录,这就是 d2d1.h 中的修复内容:

typedef struct ID2D1BitmapVtbl:

STDMETHOD_(D2D1_SIZE_F, GetSize)(
   ID2D1Bitmap *This, 
    __out D2D1_SIZE_F *Ptr
   ) PURE;

typedef struct ID2D1RenderTargetVtbl:

STDMETHOD_(D2D1_SIZE_F, GetSize)(
    ID2D1RenderTarget *This,
    __out D2D1_SIZE_F *Ptr 
    ) PURE;

并且必须像这样修复宏:

#define ID2D1Bitmap_GetSize(This, ptr) \
    ((This)->lpVtbl->GetSize(This, ptr))
#define ID2D1RenderTarget_GetSize(This, ptr) \
    ((This)->lpVtbl->GetSize(This, ptr))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-21
    • 1970-01-01
    • 2012-01-29
    • 1970-01-01
    相关资源
    最近更新 更多