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 3 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.
Foreign Language Interface User Guide and Reference Manual - 01 Dec 2021 19:34:56