C++ binding issues with C++ function returning a simple POD struct.
evilrat via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Sun May 21 18:39:04 PDT 2017
On Monday, 22 May 2017 at 01:27:22 UTC, Nicholas Wilson wrote:
> On Sunday, 21 May 2017 at 19:33:06 UTC, ParticlePeter wrote:
>> I am statically linking to ImGui [1] on Win 10 x64, quite
>> successfully till this issue came up. The noticed error so far
>> comes when an ImGui function returns an ImVec2, a simple POD
>> struct of two float members. I can use this struct as argument
>> to functions but when it is returned from a function I get a
>> 0xC0000005: Access violation reading location
>> 0xFFFFFFFFFFFFFFFF. I can even debug the process with Visual
>> Studion, mixed d and c++ sources. The functions I tested
>> return data from some internal global ImGui data, which I can
>> fully examine, the crash happens on the return statement.
>> Moreover, some functions have variations which return only one
>> component from that ImVec2 POD, which do work as expected,
>> e.g.:
>>
>> ImVec2 GetCursorPos(); // crash
>> float GetCursorPosX(); // works
>> float GetCursorPosY(); // works
>>
>> The latter do basically the same as the first one, but return
>> ImVec.x or .y respectively.
>>
>> How could I further debug this?
>> If somebody would be willing to look at the source, the
>> binding is here [2].
>>
>>
>> [1] https://github.com/ocornut/imgui
>> [2] https://github.com/ParticlePeter/imgui_lib
>
> Probably because the D side is expecting to have the struct
> returned in a pointer allocated by the callee and then the C++
> puts it in regs and BOOM.
>
> If you wrap the C++ side to return the struct by a pointer then
> use that in D, then it should work.
And this is actually D problem. In fact first bug report on this
thing was dated back to 2014. Still not fixed.
There is possible hacky workaround to try - put struct as pointer
arg instead of return and make helper method to use it, like this
-------- HACK -------------------
// extern(C++) of course
void GetCursorPos(ImVec2* v);
// helper
ImVec2 GetCursorPos()
{
ImVec2 temp;
GetCursorPos(&temp);
return temp;
}
----------------------------------
More information about the Digitalmars-d-learn
mailing list