Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Foreign function calls

5 views
Skip to first unread message

One

unread,
Jan 20, 2000, 3:00:00 AM1/20/00
to

I have been trying to use the "foreign function" package in Allegro CL
Personal Ed on Windows98. (This is not an MS Windows specific question.) I
cannot work out how to pass a pointer (e.g. to a struct) to a
"def-foreign-call"ed C function. I have seen the example in the
documentation that uses an array of one element and have tried to replicate
it for the function GetCursorPos() in user32.dll which requires a pointer to
a windows POINT.


For those who do not use the Windows API the prototype for this function is:

BOOL GetCursorPos(
LPPOINT lpPoint // address of structure for cursor position
);

and POINT is:

typedef struct tagPOINT

LONG x;
LONG y;
} POINT;

BOOL and LONG are both signed 32 bit integers.


My attempt looks like this:

(ff:def-foreign-type win-pt (:struct (x :int) (y :int)))

(ff:def-foreign-call (get-mouse "GetCursorPos") ((simple-array win-pt))
:returning :int)

(defparameter pt (ff:allocate-fobject 'win-pt))
(defparameter ptr-to-pt (make-array 1 :element-type 'win-pt))

This is the result:

> (setf (aref ptr-to-pt 0) pt)
#<foreign object of class WIN-PT>

> ptr-to-pt
#(#<foreign object of class WIN-PT>)

> (get-mouse ptr-to-pt)
33

> ptr-to-pt
#(#<unknown object of type number 3 @ #x20b>)

> pt
#<foreign object of class WIN-PT>

As you can see, the call to get-mouse has mangled the single element of
ptr-to-pt. pt is still intact.


I know that this function is in the "windows" package in Allegro but it is
the foreign call syntax that I am trying to work out. Interestingly the
"windows" package version of this function uses a type "position" from the
"common graphics" package but the struct (class?) definition is not
documented, just its accessors and a make-position function.

Justin Hellings
XWare

Jason Kantz

unread,
Jan 29, 2000, 3:00:00 AM1/29/00
to
The franz documentation isn't the easiest to understand.

I've done something like this ..

(def-foreign-type gdPoint


(:struct (x :int)
(y :int)))

Then to make an array of these points, I do this within a macro that
builds the array.

`(allocate-fobject '(:array (:struct (x :int) (y :int)) ,(/ (length xys)
2)) :c)

To build the elts I access the foreing array w/
(setf (fslot-value-tyepd (:array (:struct (x :int) (y :int)) ...

Then I pass the address of the first elt of the array, accessed w/
fslot-address-typed,
to the lisp foreign function.

--
Jason Kantz
http://kantz.com/jason

0 new messages