Andreas, #getProcAddress: is a Smalltalk message, so it does not have a return type. It does return an ExternalData because it it ultimately calls
<cdecl: void* 'FindSymbol' ( long char* ) > I had to create FindSymbol as a simply wrapper around dlsym() because the vm dies a quick death over (what I believe to be) linking hassles similar to recent problems in skype. Of course, I am referring the Linux vm or I would be calling GetProcAddress(). One thing that I considered is that the aspects of the ExternalData might be incorrect. The handle is an external address and type is an ExternalType that prints itself as void*. With many variations, if the call was made, the vm crashed. Bill -----Original Message----- From: [email protected] [mailto:[email protected]] On Behalf Of Andreas Raab Sent: Saturday, April 03, 2010 11:54 AM To: The general-purpose Squeak developers list Cc: [email protected] Subject: Re: [Pharo-project] FFI - structure pointer 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. Cheers, - Andreas _______________________________________________ Pharo-project mailing list [email protected] http://lists.gforge.inria.fr/cgi-bin/mailman/listinfo/pharo-project _______________________________________________ Pharo-project mailing list [email protected] http://lists.gforge.inria.fr/cgi-bin/mailman/listinfo/pharo-project
