[Pharo-users] Unified FFI: pointer of String as function parameter

Esteban Lorenzano estebanlm at gmail.com
Mon May 30 05:14:28 EDT 2016


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 at 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
> 
> 





More information about the Pharo-users mailing list