On Wednesday, 13 July 2016 at 02:34:14 UTC, Mike Parker wrote:
On Tuesday, 12 July 2016 at 23:55:55 UTC, Adam Sansier wrote:
Ok, Another hack:
iInterface x;
void** y = cast(void**)&x;
*y = malloc(iInterface.sizeof);
x.__vptr = cast(immutable(void*)*)(*ptr);
x.func();
works.
x is the object of type iInterface. It has no object
associated with it, basically create one using malloc and set
it's vtable.
this avoids the need to create the class.
What happens when you declare an interface that extends from
IUnknown (and not extern(C++)), then cast the pointer returned
from the COM API? It should just work without needing to muck
around with the vtable.
That was what I tried first, It didn't work. I don't know what
the problem though. I either get an access violation or the
functions don't do anything.
I think it's more complex because without extern(C++) the vtable
is in a different place than expected(it's offset by 1), so
simple casting does not work.
"A COM interface differs from a regular interface in that there
is no object.Interface entry in vtbl[0]; the entries vtbl[0..$]
are all the virtual function pointers, in the order that they
were declared. This matches the COM object layout used by Windows.
A C++ interface differs from a regular interface in that it
matches the layout of a C++ class using single inheritance on the
target machine. "