Stephan Kämper
3/29/2005 1:45:00 PM
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. <blush/>
> 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