현재 생성된 부분의 Thread 와 사용하는 스레드가 틀리므로, 어드레스 값은 같고 있지만, 실제적으로 호출이 안됨...
그러므로 , 처음에 생성한 com object을 global 쪽에 놓고 사용함.
//----------------------------------------------------------------------------------------
#ifndef _RCCOMMARSHAL_H_
#define _RCCOMMARSHAL_H_
//----------------------------------------------------------------------------------------
//----------------------------------------------------------------------------------------
//----------------------------------------------------------------------------------------
#include <vector>
using namespace std;
#include <windows.h>
//----------------------------------------------------------------------------------------
//----------------------------------------------------------------------------------------
//----------------------------------------------------------------------------------------
class CRCComMarshal
{
typedef struct
{
IID m_iid;
DWORD m_dwCookie;
}SIIDCOOKIE;
public:
CRCComMarshal();
virtual ~CRCComMarshal();
static CRCComMarshal * Instance();
bool Register(IUnknown *pUnk, REFIID riid);
bool UnRegister(REFIID riid);
bool GetInterfacePointer(REFIID riid, void **ppInterface, int nInd=1);
protected:
private:
bool Init();
bool CheckIfAlreadyRegistered(REFIID riid);
LPGLOBALINTERFACETABLE m_pGIT;
typedef vector<SIIDCOOKIE*> COOKIEVEC;
COOKIEVEC m_vecCookies;
CRITICAL_SECTION m_CS;
};
//----------------------------------------------------------------------------------------
#endif //_RCCOMMARSHAL_H_
//----------------------------------------------------------------------------------------
//----------------------------------------------------------------------------------------
//----------------------------------------------------------------------------------------
//----------------------------------------------------------------------------------------
// Contructor
/////////////////
CRCComMarshal::CRCComMarshal()
{
m_pGIT = NULL;
InitializeCriticalSection(&m_CS);
Init();
}
//----------------------------------------------------------------------------------------
///////////////////////////////////////////////////////////////
CRCComMarshal::~CRCComMarshal()
{
int nSize = m_vecCookies.size();
if (nSize > 0)
{
SIIDCOOKIE *psiid = NULL;
HRESULT hr = S_OK;
for (int nIndex=0 ; nIndex<nSize ; nIndex++)
{
psiid = NULL;
psiid = m_vecCookies[nIndex];
if (NULL != psiid)
{
if (NULL != psiid)
{
hr = S_OK;
hr = m_pGIT->RevokeInterfaceFromGlobal(psiid->m_dwCookie);
}
delete psiid;
}
}
m_vecCookies.clear();
}
}
//----------------------------------------------------------------------------------------
////////////////////////////////////////////////////////////////////
bool CRCComMarshal::Init()
{
bool bRet = true;
HRESULT hr = CoCreateInstance(CLSID_StdGlobalInterfaceTable, NULL, CLSCTX_SERVER,
IID_IGlobalInterfaceTable, (void**)&m_pGIT);
if (FAILED(hr))
bRet = false;
return bRet;
}
////////////////////////////////////////////////////////////////////
//----------------------------------------------------------------------------------------
bool CRCComMarshal::Register(IUnknown *pUnk, REFIID riid)
{
CRCCriticalSectionLock Lock(&m_CS);
bool bRet = true;
HRESULT hr = S_OK;
DWORD dwCookie=0;
//////////////////////////////////////////
// if (true == CheckIfAlreadyRegistered(riid))
// {
// return true;
// }
///////////////////////////////////////////////////////////////
hr = m_pGIT->RegisterInterfaceInGlobal(pUnk, riid, &dwCookie);
// Exit if register not successfull
//////////////////////////////////////
if ((FAILED(hr)) || (0 == dwCookie))
{
bRet = false;
return bRet;
}
// Insert the cookie into the vector
////////////////////////////////////
SIIDCOOKIE *psiid = new SIIDCOOKIE;
psiid->m_iid = riid;
psiid->m_dwCookie = dwCookie;
m_vecCookies.push_back(psiid);
return bRet;
}
bool CRCComMarshal::GetInterfacePointer(REFIID riid, void **ppInterface, int nInd)
{
CRCCriticalSectionLock Lock(&m_CS);
bool bRet = true;
HRESULT hr = S_OK;
DWORD dwCookie=0;
if (NULL == ppInterface)
{
bRet = false;
return bRet;
}
*ppInterface = NULL;
// Get the interface's Cookie from the vector
/////////////////////////////////////////////
int nSize = m_vecCookies.size();
SIIDCOOKIE *psiid = NULL;
bool bFound = false;
int nCount=nInd;
if (nCount < 1)
nCount = 1;
for (int nIndex=0 ; nIndex<nSize ; nIndex++)
{
psiid = NULL;
psiid = m_vecCookies[nIndex];
if (NULL != psiid)
{
if (riid == psiid->m_iid)
{
nCount--;
if (0 == nCount)
{
bFound = true;
dwCookie = psiid->m_dwCookie;
break;
}
}
}
}
if (true != bFound)
{
return false;
}
// Retrieve the interface pointer from Glabal interface table
///////////////////////////////////////////////////////////////
hr = m_pGIT->GetInterfaceFromGlobal(dwCookie, riid, ppInterface);
if ((FAILED(hr)) || (NULL == *ppInterface))
{
bRet = false;
return bRet;
}
return bRet;
}
/////////////////////////////////////////////////////////////////////
bool CRCComMarshal::CheckIfAlreadyRegistered(REFIID riid)
{
int nSize = m_vecCookies.size();
bool bFound = false;
SIIDCOOKIE *psiid = NULL;
for (int nIndex=0 ; nIndex<nSize ; nIndex++)
{
psiid = NULL;
psiid = m_vecCookies[nIndex];
if (NULL != psiid)
{
if (riid == psiid->m_iid)
{
bFound = true;
break;
}
}
}
return bFound;
}
//----------------------------------------------------------------------------------------
////////////////////////////////////////////////////////////////////
bool CRCComMarshal::UnRegister(REFIID riid)
{
CRCCriticalSectionLock Lock(&m_CS);
int nSize = m_vecCookies.size();
bool bFound = false;
SIIDCOOKIE *psiid = NULL;
for (int nIndex=0 ; nIndex<nSize ; nIndex++)
{
psiid = NULL;
psiid = m_vecCookies[nIndex];
if (NULL != psiid)
{
if (riid == psiid->m_iid)
{
bFound = true;
break;
}
}
}
HRESULT hr = S_OK;
if ((NULL != psiid) && (true == bFound))
{
hr = m_pGIT->RevokeInterfaceFromGlobal(psiid->m_dwCookie);
m_vecCookies.erase(m_vecCookies.begin() + nIndex);
if (FAILED(hr))
{
return false;
}
}
return true;
}
저는 이렇게 사용했습니다...
전에 SSL질문을 했는데, 잘알려줘서, 제가 아는 범위로 답변했습니다.
그댄 아직 해결 못했어요...ㅠㅠ.환경설정을 잘 못하겠네요