On 30/05/16 11:44, Esteban Lorenzano wrote:
On 30 May 2016, at 11:39, Julien Delplanque <jul...@tamere.eu> wrote:
I just did it, it works directly except for 2 little mistakes (for people who
are interested):
The class method to override in StringValueHolder is #typeDecl and not
#typeDesc.
To get the actual String from the StringValueHolder, no need to call
#readString on the
result of #value, it causes an error because #value already returns a String.
oh well, I was coding by heart ;)
Indeed, I mean no offense, I just wanted to fix this for people who will
need to do this in the future. :-p
Thanks a lot for this explanation Esteban :-).
you’re welcome :)
Esteban
Regards,
Julien
On 30/05/16 11:14, Esteban Lorenzano wrote:
this is not the easiest part of FFI :)
this is the simplest way:
str := ExternalAddress new. “This will point to NULL”
self callToMyFunction: str.
pharoString := (str pointerAt: 1) readString.
callToMyFunction: str
self ffiCall: #( void function ( char ** str ) )
now, another way is to declare a value holder:
1) subclass FFIExternalValueHolder.
FFIExternalValueHolder subclass: #StringValueHolder.
2) implement class side method typeDesc
StringValueHolder class>>typeDesc
^ String
3) implement your method replacing char** for your value holder:
callToMyFunction: str
self ffiCall: #( void function ( StringValueHolder* str ) )
then you call like this:
str := StringValueHolder new.
self callToMyFunction: str.
pharoString := str value readString.
looks like too much steps for just economise the “pointeAt: 1” part, but is
useful when you have lots of this calls :)
cheers,
Esteban
On 30 May 2016, at 10:56, Julien Delplanque <jul...@tamere.eu> wrote:
Hello everyone,
I have a C function to call from Pharo that looks like this:
int my_function(char ** parameter);
This function fill the pointer on the String given as parameter.
How can I use this from pharo Unified FFI? I mean, how to get a pharo String
filled by this function?
Thanks in advance,
Julien