> 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 ;) > > 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 >>> >>> >> > >