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 <julien@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