Microsoft MVP성태의 닷넷 이야기
글쓴 사람
light
홈페이지
첨부 파일
 
부모글 보이기/감추기

현재 생성된 부분의 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질문을 했는데, 잘알려줘서, 제가 아는 범위로 답변했습니다.
그댄 아직 해결 못했어요...ㅠㅠ.환경설정을 잘 못하겠네요








[최초 등록일: ]
[최종 수정일: 10/30/2006]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 작성자
 




... 166  167  [168]  169  170  171  172  173  174  175  176  177  178  179  180  ...
NoWriterDateCnt.TitleFile(s)
826정성태1/3/201030204기타: 28. 2009년 인기 순위 정리
825정성태1/3/201047016개발 환경 구성: 65. .NET 응용 프로그램에서 64비트 Oracle Data Access Components 사용 [5]
823정성태1/1/201024289개발 환경 구성: 64. ODP.NET 설치 작업 없이 ASP.NET 응용 프로그램 배포파일 다운로드1
822정성태1/1/201086520개발 환경 구성: 63. ODP.NET 설치 없이 .NET 클라이언트 프로그램 배포하는 방법 [6]파일 다운로드2
821정성태1/1/201049381개발 환경 구성: 62. .NET 응용 프로그램에서 Oracle XE 사용 [1]
820정성태12/29/200920790개발 환경 구성: 61. Oxite 소스 코드를 Visual Studio 2010으로 마이그레이션파일 다운로드1
818정성태12/27/200919463개발 환경 구성: 60. Cassini 서버를 localhost 이외의 주소에서 접근하도록 변경
817정성태12/21/200920931개발 환경 구성: 59. WebDev 2.0에서 실행하는 Pet Shop 4.0
816정성태12/19/200922620개발 환경 구성: 58. Pet Shop 4.0을 IIS 없이 실행하는 방법 [1]파일 다운로드1
815정성태12/18/200925578개발 환경 구성: 57. Pet Shop 4.0 - SQL Server Compact Edition Version - 두 번째 이야기파일 다운로드1
814정성태12/16/200920826오류 유형: 91. VS2010 beta2 - The application cannot start
812정성태12/11/200924391개발 환경 구성: 56. Pet Shop 4.0 - SQL Server Compact Edition Version파일 다운로드2
811정성태12/2/200937936.NET Framework: 169. [in, out] 배열을 C#에서 C/C++로 넘기는 방법 - 두 번째 이야기 [8]파일 다운로드2
810정성태12/1/200934394.NET Framework: 168. [in,out] 배열을 C#에서 C/C++로 넘기는 방법 [3]
809정성태11/27/200924350오류 유형: 90. Method not found: 'Void System.Reflection.Emit.DynamicMethod..ctor(System.String, System.Type, System.Type[])'.
808정성태11/26/200933205VC++: 38. X64 빌드 오류: error LNK2001: unresolved external symbol [COMDLL]_ProxyFileInfo
807정성태11/23/200926946웹: 14. 로컬에 있는 HTML 페이지를 보호 모드에서 여는 방법
802정성태11/19/200929014.NET Framework: 167. 다른 스레드의 호출 스택 덤프 구하는 방법파일 다운로드1
801정성태11/18/200936634개발 환경 구성: 55. Hyper-V와 고성능 그래픽 카드의 성능 문제 해결 [1]
800정성태11/13/200929315VS.NET IDE: 66. 수동으로 구성해 본 VC++ 프로젝트 설정: ReleaseMinDependency
798정성태11/10/200927996개발 환경 구성: 54. .NET 개발자가 처음 설치해 본 TOMCAT [2]
797정성태11/9/200924351개발 환경 구성: 53. 물리 PC에 설치된 Windows 7을 Hyper-V로 이전하면?
796정성태11/2/200928269오류 유형: 89. Windows 7 백업 오류 - 0x80070057
795정성태11/2/200925594오류 유형: 88. TFS 2010 (beat2) 설치 오류 -TF255272
793정성태10/19/200927573.NET Framework: 166. WPF - XAML 요소의 네임스페이스와 CLR 타입 매핑
792정성태10/17/200927788웹: 13. IIS 7.5 에서 SQL Express 연결 시 오류
... 166  167  [168]  169  170  171  172  173  174  175  176  177  178  179  180  ...