问题描述
我正在使用C风格的界面使用Direct2D。除了两个返回结构的函数,即ID2D1Bitmap_GetSize
和ID2D1rendertarget_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))