#ifndef _COM_COMINIT_HPP_ #define _COM_COMINIT_HPP_ #ifndef _COM_OBJBASE_HPP_ #include #endif #ifndef _COM_OLE2_HPP_ #include #endif #ifndef __SGI_STL_MAP #include #endif class Comparator { public: bool operator()(const HANDLE h1,const HANDLE h2)const{return (int)h1<(int)h2;} }; class ComInitializer { public: typedef map ThreadMap; ComInitializer(void); virtual ~ComInitializer(); private: ComInitializer(const ComInitializer &someComInitializer); ComInitializer &operator=(const ComInitializer &someComInitializer); static ThreadMap smThreadMap; }; inline ComInitializer::ComInitializer(void) { HANDLE hCurrentThread(::GetCurrentThread()); if(0==smThreadMap[hCurrentThread]){smThreadMap[hCurrentThread]=1;::CoInitialize(NULL);} else{smThreadMap[hCurrentThread]=smThreadMap[hCurrentThread]+1;} } inline ComInitializer::ComInitializer(const ComInitializer &/*someComInitializer*/) { // private implementation } inline ComInitializer::~ComInitializer() { HANDLE hCurrentThread(::GetCurrentThread()); if(1==smThreadMap[hCurrentThread]){smThreadMap[hCurrentThread]=0;::CoUninitialize();} else{smThreadMap[hCurrentThread]=smThreadMap[hCurrentThread]-1;} } inline ComInitializer &ComInitializer::operator=(const ComInitializer &/*someComInitializer*/) { // private implementation return *this; } #endif