从Direct2D中的C宏获取虚假的返回值

问题描述

我正在使用C风格的界面使用Direct2D。除了两个返回结构的函数,即ID2D1Bitmap_GetSizeID2D1rendertarget_GetSize之外,此方法都可以正常工作。他们返回一个D2D1_SIZE_F结构,它是64位(它包含两个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.height);

我从两个GetSize调用中都得到了虚假的值,因此似乎在寄存器级别上有些混乱。有趣的是,有人似乎也遇到过类似的问题(see here),但他使用的是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))