What is the proper way to pass a void* to a C++ instance?
Daniel Kochmański
daniel at turtleware.eu
Wed Dec 14 06:18:39 UTC 2016
Hey Ryan,
Ryan writes:
> Hello all,
>
> I'm working on a C++ project.
> For example let's say I have a class called MyClass
>
> In C++ I might have
>
> void* ptr = new MyClass(); // Assume default constructor
>
> What is the proper way to turn ptr into a cl_object?
> What is the proper way to decode the encoded cl_object back to C++'s
> void pointer so I can recast it?
cl_object foreign = ecl_make_foreign_data(ECL_NIL, sizeof(MyClass*), &obj);
notice, that it doesn't have to be a pointer, in that case the object
will be serialized with a cast to char*.
MyClass *foo = ecl_foreign_data_pointer_safe(foreign);
Moreover you may add your own finalizer to your object:
cl_object poof_my_class(cl_object h) {
MyClass *foo = ecl_foreign_data_pointer_safe(foreign);
printf("Poofing foo!\n");
delete foo;
return ECL_T;
}
si_set_finalizer(foreign, poof_my_class);
>
> I've read the documentation and tried a bunch of things.
> Finally giving in and asking for a bit of direction since it's not
> working as I'd expect.
For finalizers description see:
https://common-lisp.net/project/ecl/manual/ch30s05.html
Here you will find how to use arbitrary CL library in your C application:
https://common-lisp.net/project/ecl/static/ecldoc/Extensions.html#System-building
For FFI description see:
https://common-lisp.net/project/ecl/static/ecldoc/Extensions.html#Foreign-Function-Interface
I've added a ticket about documenting thing you ask for:
https://gitlab.com/embeddable-common-lisp/ecl/issues/324
>
> I was using ecl_make_pointer(ptr) to try and make a cl_object
> I was using ecl_to_pointer([formerly created cl_object here]) to try and
> convert the cl_object pointer to a C++ void*
>
> Maybe the bug is elsewhere or I'm not understanding...
ECL documentation needs more embedding examples, but we are working on
that. Hope these advices help.
>
> Sincerely,
> Ryan
Best regards,
Daniel
--
Daniel Kochmański ;; aka jackdaniel | Przemyśl, Poland
TurtleWare - Daniel Kochmański | www.turtleware.eu
"Be the change that you wish to see in the world." - Mahatma Gandhi
More information about the ecl-devel
mailing list