In the previous example our defined interface function get-cursor-position
used the function fli: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 fli: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:
fli:with-dynamic-foreign-objects
is called, which ensures that the lifetime of any allocated objects is within the scope of the code specified in its body. fli:allocate-dynamic-foreign-object
is called to create an instance of the relevant data structure required to get the cursor position. Refer to it using the lppoint
pointer. get-cursor-position
is called with lppoint
. GetCursorPos
was successful the function fli: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.