从 Direct2D 中的 C 宏获取伪造的 return 值
Getting bogus return values from C macros in Direct2D
我正在使用 C 风格界面的 Direct2D。除了 return 结构的两个函数,即 ID2D1Bitmap_GetSize
和 ID2D1RenderTarget_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))
我正在使用 C 风格界面的 Direct2D。除了 return 结构的两个函数,即 ID2D1Bitmap_GetSize
和 ID2D1RenderTarget_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
调用中都得到了伪造的值,所以看起来在寄存器级别上有些东西被弄乱了。有趣的是,有人似乎遇到了类似的问题 (
由于可能没有人使用 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))