When the control is destroyed we free the memory we allocated and call a cleanup routine for any other business (if required). Note our _SB_Cleanup
function in our WM_NCDESTROY
message (shown below,) is called first whilst the memory for our variables/properties still exists - This is important in case we have to free any other resources, handles or objects that we have stored previously in our internal or external properties.
...
.ELSEIF eax == WM_NCDESTROY
Invoke _SB_Cleanup, hWin ; cleanup any other stuff as required
Invoke __FreeMemProperties, hWin, INTERNAL_PROPERTIES
Invoke __FreeMemProperties, hWin, EXTERNAL_PROPERTIES
mov eax, 0
ret
...
Our internal helper function __FreeMemProperties
used GetWindowLong to retrieve the appropriate pointer for the internal and external memory blocks used to store our variables and then frees that memory with calls to GlobalFree.