성태의 닷넷 이야기
홈 주인
모아 놓은 자료
프로그래밍
질문/답변
사용자 관리
사용자
메뉴
아티클
외부 아티클
유용한 코드
온라인 기능
MathJax 입력기
최근 덧글
[정성태] Roll A Lisp In C - Reading ; https...
[정성태] Java - How to use the Foreign Funct...
[정성태] 제가 큰 실수를 했군요. ^^; Delegate를 통한 Bein...
[정성태] Working with Rust Libraries from C#...
[정성태] Detecting blocking calls using asyn...
[정성태] 아쉽게도, 커뮤니티는 아니고 개인 블로그입니다. ^^
[정성태] 질문이 잘 이해가 안 됩니다. 우선, 해당 소스코드에서 ILis...
[양승조
] var대신 dinamic으로 선언해서 해결은 했습니다. 맞는 해...
[양승조
] 또 막혔습니다. ㅠㅠ var list = props[i].Ge...
[양승조
] 아. 감사합니다. 어제는 안됐던것 같은데....정신을 차려야겠네...
글쓰기
제목
이름
암호
전자우편
HTML
홈페이지
유형
제니퍼 .NET
닷넷
COM 개체 관련
스크립트
VC++
VS.NET IDE
Windows
Team Foundation Server
디버깅 기술
오류 유형
개발 환경 구성
웹
기타
Linux
Java
DDK
Math
Phone
Graphics
사물인터넷
부모글 보이기/감추기
내용
현재 생성된 부분의 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질문을 했는데, 잘알려줘서, 제가 아는 범위로 답변했습니다. 그댄 아직 해결 못했어요...ㅠㅠ.환경설정을 잘 못하겠네요
첨부파일
스팸 방지용 인증 번호
1079
(왼쪽의 숫자를 입력해야 합니다.)