This commit is contained in:
2024-08-07 09:12:07 -04:00
parent ca445435a0
commit fdfadd5c7e
1021 changed files with 73601 additions and 0 deletions

107
com/cominit.hpp Normal file
View File

@@ -0,0 +1,107 @@
#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
enum ComModel{MultiThreaded=COINIT_MULTITHREADED,ApartmentThreaded=COINIT_APARTMENTTHREADED};
class Comparator
{
public:
bool operator()(const DWORD h1,const DWORD h2)const{return (int)h1<(int)h2;}
};
class ComInitializer
{
public:
typedef map<DWORD,int,Comparator> ThreadMap;
typedef map<DWORD,int,Comparator> ProcessMap;
ComInitializer(ComModel comModel=MultiThreaded);
virtual ~ComInitializer();
ComModel getThreadModel(void)const;
private:
ComInitializer(const ComInitializer &someComInitializer);
ComInitializer &operator=(const ComInitializer &someComInitializer);
void initialize(void);
void uninitialize(void);
static ThreadMap smThreadMap;
static ProcessMap smProcessMap;
ComModel mThreadModel;
};
inline
ComInitializer::ComInitializer(ComModel comModel)
: mThreadModel(comModel)
{
initialize();
}
inline
ComInitializer::ComInitializer(const ComInitializer &/*someComInitializer*/)
{ // private implementation
}
inline
ComInitializer::~ComInitializer()
{
uninitialize();
}
inline
ComInitializer &ComInitializer::operator=(const ComInitializer &/*someComInitializer*/)
{ // private implementation
return *this;
}
inline
void ComInitializer::initialize(void)
{
DWORD currentThread(::GetCurrentThreadId());
DWORD currentProcess(::GetCurrentProcessId());
switch(getThreadModel())
{
case ApartmentThreaded :
if(0==smThreadMap[currentThread]){smThreadMap[currentThread]=1;::CoInitializeEx(NULL,getThreadModel());}
else{smThreadMap[currentThread]=smThreadMap[currentThread]+1;}
break;
case MultiThreaded :
if(0==smProcessMap[currentProcess]){smProcessMap[currentProcess]=1;::CoInitializeEx(NULL,getThreadModel());}
else{smProcessMap[currentProcess]=smProcessMap[currentProcess]+1;}
break;
}
}
inline
void ComInitializer::uninitialize(void)
{
DWORD currentThread(::GetCurrentThreadId());
DWORD currentProcess(::GetCurrentProcessId());
switch(getThreadModel())
{
case ApartmentThreaded :
if(1==smThreadMap[currentThread]){smThreadMap[currentThread]=0;::CoUninitialize();}
else smThreadMap[currentThread]=smThreadMap[currentThread]-1;
break;
case MultiThreaded :
if(1==smProcessMap[currentProcess]){smProcessMap[currentProcess]=0;::CoUninitialize();}
else smProcessMap[currentProcess]=smProcessMap[currentProcess]-1;
break;
}
}
inline
ComModel ComInitializer::getThreadModel(void)const
{
return mThreadModel;
}
#endif