There is a similar question [here](https://stackoverflow.com/questions/31874510/getting-a-controls-parent-form-vba-vb6), which unfortunately does not help me. When I make a call to `UserControl.Parent`, either a `Form` or another `UserControl` can be returned. If a Form is returned, I have what I want. But if a `UserControl` is returned, I have no way of iterating up the chain, since `UserControl` is the base class name, and I do not have access to the base class name outside of the control's implementation. 

Technically, I could probably get around this by exposing the Parent property on every single `UserControl` in the application, but I would really like to avoid doing this (we have thousands of them).

My ultimate goal is to get a reference to the parent form which is hosting the control, so that the control can subscribe to the `Form_Unload` event. Here the control will remove and clean up a hosted .NET interopped control which is preventing the VB6 `UserControl` from raising its `UserControl_Terminated` event, thus leaking GDI objects and memory.

So far I have tried to make calls to `GetParent()`, `GetWindow()` and `GetAncestor()` functions in USER32.dll in the `UserControl_Initialize` and `UserControl_Resize` events, and then cross referencing with the hWnds on the forms in the `Forms` collection, but both of these events seem to be raised before the UserControl has been sited on its host form.