On Monday, 19 December 2016 at 09:49:13 UTC, kinke wrote:
On Saturday, 3 December 2016 at 09:51:00 UTC, John C wrote:
Some DirectX methods return structs by value, but when I try
calling them I either get garbage or an access violation.
Usually COM methods return structs by pointer as a parameter,
but these are returning the struct as the actual return value,
as in this definition:
extern(Windows):
struct D2D1_SIZE_F { float width, height; }
interface ID2D1Bitmap : ID2D1Image {
D2D1_SIZE_F GetSize();
}
If I rewrite GetSize to return by pointer as a parameter, it
appears to work and I get the correct width and height without
an AV being thrown. And I can add a helper method that returns
by value:
interface ID2D1Bitmap : ID2D1Image {
void GetSize(D2D1_SIZE_F* size);
final D2D1_SIZE_F GetSize() {
D2D1_SIZE_F size;
GetSize(&size);
return size;
}
}
yes it works indeed O_o
also align(8) for struct seems to work in x86 but has some issues
with ESP(reserved 4 bytes for pointer, still has 4 bytes for
second float?), crashes without align at later point.
x64 still has messed up 'this'(both dmd and ldc, not tested with
gdc),
but with passing parameter instead of return it really keeps
stack where it leaves it and even 'this' are in place so
everything is seems to work.