




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