Eric Hodel 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
···
On 28 Mar 2005, at 09:59, Stephan Kämper wrote: