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
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