58 lines
1.4 KiB
C++
58 lines
1.4 KiB
C++
#ifndef _COM_COMINIT_HPP_
|
|
#define _COM_COMINIT_HPP_
|
|
#ifndef _COM_OBJBASE_HPP_
|
|
#include <com/objbase.hpp>
|
|
#endif
|
|
#ifndef _COM_OLE2_HPP_
|
|
#include <com/ole2.hpp>
|
|
#endif
|
|
#ifndef __SGI_STL_MAP
|
|
#include <sgi_stl/map>
|
|
#endif
|
|
|
|
class Comparator
|
|
{
|
|
public:
|
|
bool operator()(const HANDLE h1,const HANDLE h2)const{return (int)h1<(int)h2;}
|
|
};
|
|
|
|
class ComInitializer
|
|
{
|
|
public:
|
|
typedef map<HANDLE,int,Comparator> 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 |