From: "Stephan Kämper" Date: 2005-03-29T22:49:48+09:00 Subject: Re: DL usage / DL documentation Eric Hodel wrote: > On 28 Mar 2005, at 09:59, Stephan K�mper wrote: > >> Hi all, >> >> I currently try to call a function in a DLL, which has a prototype >> like this: >> >> int test(int an_int, long * a_ptr_to_long, char * a_string); >> >> How do I get a 'long *' into the method from Ruby using DL? > > DL just does it: Thanks for answering. I'm sure it does. But apparently I'm a bit stupid these days - I still don't get it. > require "dl" > require "dl/import" > require "dl/struct" > > module LIBC > > extend DL::Importable > > dlload "libc.dylib" > > typealias "const time_t *clock", "long ref" What does the 'clock' and 'ref' part mean it this typealias? Does that mean a "const time_t *" is just another (type) name for "long"? > StructTm = struct [ > "int tm_sec", # seconds (0 - 60) > "int tm_min", # minutes (0 - 59) > "int tm_hour", # hours (0 - 23) > "int tm_mday", # day of month (1 - 31) > "int tm_mon", # month of year (0 - 11) > "int tm_year", # year - 1900 > "int tm_wday", # day of week (Sunday = 0) > "int tm_yday", # day of year (0 - 365) > "int tm_isdst", # is summer time in effect? > "long tm_gmtoff", # offset from UTC in seconds > "char *tm_zone", # abbreviation of timezone name > ] > > extern "struct tm * localtime(const time_t *clock)" > > def self.c_localtime(clock) > tm = LIBC.localtime(clock) > return LIBC::StructTm.new(tm) > end > > end > > p LIBC.c_localtime(Time.now.to_i).tm_min What would I have to do if the called DLL function changes the thing pointed to? I'll just return to 'my' function mentioned above: > int test(int an_int, long * a_ptr_to_long, char * a_string); As far as I understood, something like this might be a start: require "dl" require "dl/import" require "dl/struct" module Foo extend DL::Importable dlload "mylinb.dll" extern "int test(int, long *, char)" end # Now create some variables, to pass into 'Foo.test' index = 42 name = "F. Prefect" # ... missing code here to create ptr_to_long ret = Foo.test( index, ptr_to_long, name ) How (I think) that's my question: How can I creatthat ptr_to_long thing - and how would I get back the value (to which it points after the function call)? Still confused (I should incorporate some C/C++ in one of my next projects to used to pointers and pointees again...) Happy rubying Stephan