从 Direct2D 中的 C 宏获取伪造的 return 值

Getting bogus return values from C macros in Direct2D

我正在使用 C 风格界面的 Direct2D。除了 return 结构的两个函数,即 ID2D1Bitmap_GetSizeID2D1RenderTarget_GetSize,这工作正常。它们 return 一个 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 调用中都得到了伪造的值,所以看起来在寄存器级别上有些东西被弄乱了。有趣的是,有人似乎遇到了类似的问题 (),但他使用的是 MinGW 和 C++,人们说这是一个 MinGW 问题。我不在 MinGW 上,但我在使用旧版本的 Visual C(x64 为 15.00.30729.01),我不使用 C++,而是使用 C.

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

仅作记录,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))