In the previous example our defined interface function get-cursor-position
used the function allocate-foreign-object to allocate memory for an instance of a POINT
structure. This memory is now reserved, with a pointer to its location bound to the variable location
. More detailed information on pointers is available in FLI Pointers. To free the memory associated with the foreign object requires the use of the function free-foreign-object.
(fli:free-foreign-object location)
There are other methods for dealing with the question of memory management. The following example defines a Lisp function that returns the x and y coordinates of the cursor without permanently tying up memory for structures that are only used once.
(defun current-cursor-position ()
(fli:with-dynamic-foreign-objects ()
(let ((lppoint (fli:allocate-dynamic-foreign-object
:pointer-type 'lppoint)))
(if (get-cursor-position lppoint)
(values t (fli:foreign-slot-value lppoint 'x)
(fli:foreign-slot-value lppoint 'y))
(values nil 0 0)))))
On calling current-cursor-position
the following happens:
lppoint
pointer.get-cursor-position
is called with lppoint
.GetCursorPos
was successful the function foreign-slot-value is called twice, once to return the value in the x
slot and again to return the value in the y
slot. If the call was unsuccessful then 0 0 nil
is returned.LispWorks Foreign Language Interface User Guide and Reference Manual - 16 Feb 2015