Window Procedure memory management (MSWIN-specific)
Suppose I have some subclassed window procedure written in Lisp as a foreign-
callable:
(fli:define-foreign-callable
(lisp-wnd-proc :result-type (:one-of :long (:boolean :long))
:calling-convention :stdcall)
((hWnd HWND) (uMsg ULONG) (wParam ULONG) (lParam ULONG))
(case uMsg
;; Handle messages here...
)
(prog1
; Pass control back to the original window procedure...
(CallWindowProc *orig-wnd-proc* hWnd uMsg wParam lParam)
(when (= uMsg WM_NCDESTROY)
; Some Lisp clean-ups here...
))))
It might be that we receive, via lParam, the address of some struct. Now how
exactly should this be handled?
Obviously one can't coerce/cast a raw memory address, so what I have been doing
is simply to create an FLI pointer of the struct type in question and set its
address to the address passed through lParam. But then what do I do with this
pointer when it is no longer needed? Given that the memory for the struct is
handled by the OS my assumption has been that I should not have to explicitly
free the pointer.
This is what Section 3.1.3 of the FLI Guide says:
'If a foreign object is no longer needed, it should be deallocated using
free-foreign-object. This should be done only once for each foreign object,
regardless of the number of pointer objects that contain its address.'
So if the OS is freeing the memory allocated for the struct by my reckoning the
above implies that I don't have to explicitly free the pointer I created.
So am I doing the right thing? Or is this where the :reference keyword and its
friends come into play?
Thanks in advance,
Chris