In C#, I use the System.:Runtime::InteropServices::Marshal class to do this, and it works well. I would imagine in C++, it would be something like
cSetup = Marshal::GetObjectFromIUnknown(IntPtr(pSetup));
This will properly marshal the pointer into the .NET interop, and set the refcount accordingly.