Why did you not make use of CComPtr, ComPtr or the _com_ptr_t smart pointers?
https://msdn.microsoft.com/en-us/library/ezzw7k98.aspx
https://msdn.microsoft.com/en-us/library/br244983.aspx
I did use CComPtr, but they only reduce the amount of footguns, they don't get rid of them. In my case, I accidentally stored a reference to the inner pointer instead of calling Detach.
My point isn't that there aren't nice idiomatic ways of writing nice windows/c++ code that are not fragile, it's that unless you're well versed in them, you can easily screw things up pretty badly.
[EDIT]: In case it's not clear, I am not a windows C++ developer, I've read a decent amount of windows C++ code, so I sort of know what's going on, but I've written less than 5k lines of windows C/C++ in my life.
Fare enough. I know Windows since Win16 APIs days (started with Windows 3.0)
I would run into similar issues when coding for Apple platforms, for example.
I ended up still writing it in C++ since Rust's support for writing COM objects/servers was not great, but I also ended up having to chase down a bug where I forgot to AddRef before storing a COM pointer in a map.