ATL COM 객체에서 Thread를 통해서Event 발생시키기
파일을 다운로드 받거나 http://download.microsoft.com/download/a/5/5/a552e657-1ecb-453d-9bae-17d0db333337/atlcpimplmt.exe
첨부 파일을 다운로드 받아서 설치 한다
첨부된 atlcpimplmt.zip
을 다운로드 받아서 설치 한다. 위치=C:\Program Files (x86)\Microsoft Visual Studio\VC98\ATL\Include
,설치 하지 않으면 “ATLCPImplMT.h” 파일을 찾을 수 없다 는 에러가 발생 한다.
1.이벤트 처리 루티이 들어 있는 파일을 열어서 헤더를 선언하고 ConnectionPoint 상속을 변경한다
# include “ATLCPImplMT.h”
template <class T>
class CProxy_ClassEvents : public IConnectionPointImplMT<T, &DIID__IClassEvents, CComDynamicUnkArray>
class CProxy_ClassEvents : public IConnectionPointImplMT<T, &DIID__IClassEvents, CComDynamicUnkArray>
IConnectionPointImpl->IConnectionPointImplMT
2. 이벤트를 발생 시키는 Fire_XXX 부분을 바꿔준다.
for (nConnectionIndex = 0; nConnectionIndex < nConnections; nConnectionIndex++)
{// pT->Lock();
// CComPtr<IUnknown> sp = m_vec.GetAt(nConnectionIndex);
// pT->Unlock();수정)CComPtr<IUnknown> sp;sp.Attach (GetInterfaceAt(nConnectionIndex));…………………
3. 쓰레드 함수 구현
CoInitializeEx, ::CoUninitialize (); 를 눈여겨 보자 thread로 이벤트를 발생시킬때반드시 CoInitializeEx 를 실행하고 이벤트를 발생시킨다.이벤트가 종료된 후에는 ::CoUninitialize (); 로 마무리 해야 한다.그렇지 않으면 특성한 시점에 문제가 될 수 있다, Mutex와 같은 역활을 하므로 잊어서는 안된다’DWORD WINAPI justDoIt(LPVOID lpParameter){// Initialize COM,HRESULT hRes = CoInitializeEx(NULL, COINIT_MULTITHREADED);CMyAtl *myAtl = (CMyAtl*)lpParameter;long result;for (int i = 1; i <= myAtl->m_number; ++i)result = i * 2;myAtl->Fire_XXX(result);::CoUninitialize ();return 0;}
'개발언어 > c++' 카테고리의 다른 글
윈도우 시스템 정보 얻기 (0) | 2016.07.16 |
---|---|
MFC 다국어 지원 방법(국가별 언어설정) (0) | 2016.07.15 |
Event Driven Programming using Template Specializations in C++ (0) | 2016.07.09 |
시스템 아이콘 Merge 시켜 사용하기 (0) | 2016.06.13 |
HSB(HSV) 값을 RGB로 변경하는 공식 (0) | 2016.06.13 |