Files
Work/com/hold/cominit.hpp
2024-08-07 09:12:07 -04:00

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