From my recent experiance, you can't properly impliment a singleton in a DLL; you have to use an .EXE. It's not all that hard - make a new ATL project with EXE (not server). Create a new ATL Simple Com object (MyCollection). Make it a singleton with the DECLARE_CLASSFACTORY_SINGLETON(CMyCollection) macro. Modify your STDAFX.H generated file and change _ATL_APARTMENT_THREADED to _ATL_FREE_THREADED. You're good to go. Register it. Import your generated .TLB to make the smart pointers and whatever. I suggest using something like this: MyServerApp::IMySingletonPtr iSingle("MyServerApp.MySingleton") for each use, since it's very possible for the user to kill the process. Word of warning: once the last usage of your singleton (addref/release) is released, if there is no activity for 5 seconds, then it will be destroyed. If this is a problem, then either use connection points or some other refernce mechanisim.