[squeak-dev] Re: FFI - structure pointer

Andreas Raab andreas.raab at gmx.de
Sat Apr 3 16:53:31 UTC 2010

On 4/3/2010 6:36 AM, Schwab,Wilhelm K wrote:
> Andreas, John, anybody,
> I need to find the address of a "function" (it is in fact a global structure pointer somewhere in memory) and pass it to another function.
> Suppose the structure is called Type and the function allocate_one().  I call the function something like
> allocateOne:type size:anInt
>    <cdecl: SomeOtherStruct* 'allocate_one' ( Type* long )>
> but I am having an awful time getting the pointer to Type.  Given that dlsym() will return a pointer to it, how can I represent that in Smalltalk?  I have tried variations on
>    "Indirectly call dlsym()"
>    address := Library default getProcAddress:'name_of_global_struct'.
>    "try to create Type* from the resulting address"
>    type := Type fromHandle:address.
>    type := Type fromHandle:address getHandle.
>    type := ExternalData fromHandle:address type:Type externalType asPointerType.
>    Something := Library default allocateOne:type size:2.
> and it either complains about bad arguments during the call or segment faults.  Any ideas or similar examples?

The return type of getProcAddress: is likely wrong. It should be 
declared to return void* which will cause it to return an ExternalData. 
With an ExternalData your second variant "Type fromHandle: data 
getHandle" will work.

   - Andreas

More information about the Squeak-dev mailing list