학생시절 구현했던 IOCP서버 예제

IOCPServer.zip


페졸드 아저씨의 Checker 소스와 IOCP를 이용하여 간단한 소켓통신 구현

CheckerIOCP_2.zip


이것도 MFC 공부할때 잠깐 만들어본것.

Spy++ 따라 만드려고 했던 프로그램.

Finder.zip

if(::GetForegroundWindow() != GetSafeHwnd()) {
    HWND hActiveWnd = ::GetForegroundWindow();
    if(hActiveWnd != NULL) {
        DWORD ThreadID = GetWindowThreadProcessId(hActiveWnd, NULL);
        DWORD CurrentThreadID = GetCurrentThreadId();
        if(CurrentThreadID != ThreadID) {
            if(AttachThreadInput(CurrentThreadID, ThreadID, TRUE)) {
                ::BringWindowToTop(GetSafeHwnd());
                AttachThreadInput(CurrentThreadID, ThreadID, FALSE);
            }
        }
    }
}

DirectShow 에서 I420 포맷은 정의되어 있지 않다.

아래와 같이 정의하면 사용할 수 있다.

// {30323449-0000-0010-8000-00aa00389b71}
DEFINE_GUID(MEDIASUBTYPE_I420,
   0x30323449, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71);

MFC 공부할때 작업관리자 흉내내보려고 만들기 시작한 것.

완성은 못했다. 프로세스 제어하기 위한 API 들을 사용해 봤다는 것뿐...

Tmanager.zip


HTML 컨트롤을 선택하여 기본적으로 제공되는 소스를 수정한 DHTML컨트롤.

기존의 IDHTCtrlUI을 삭제(이때, 컴파일 에러는 전부 주석처리)하고 외부로 노출될 UIObj Object를 추가했다.(ATL Object Wizard)

IDHTCtrl 인터페이스 생성부분에서 아래와 같이 수정 및 멤버변수를 추가했다.

// 웹 브라우저 생성, 인터페이스 교환
LRESULT OnCreate(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
{
        CAxWindow wnd(m_hWnd);

        // 1. Web Browser 컨트롤 생성
        HRESULT        hr        =        wnd.CreateControl(IDH_DHTCTRL);
        if(SUCCEEDED(hr)) {
                hr        =        CComObject<CUIObj>::CreateInstance(&m_pUI);
                if(SUCCEEDED(hr)) {

                        // 2. Web Browser에게 연동되는 UIDisp 전달
                        CComQIPtr<IDispatch> pDisp(m_pUI);
                        hr        =        wnd.SetExternalDispatch(pDisp);
                }
                if(SUCCEEDED(hr)) {

                        // 3. Web Browser가 노출하고 있는 Interface 포인터 획득
                        hr        =        wnd.QueryControl(IID_IWebBrowser2, (void**)&m_spBrowser);

                        // 4. Web Browser와 실제 연동할 m_pUI인터페이스에게 Web Interface 전달
                        m_pUI->put_Web(m_spBrowser);
                }
        }
        return SUCCEEDED(hr)?0:-1;
}

CComObject<CUIObj>                *m_pUI;

//////////////////////////////////////////////////////////////////////////////

IUIObj 인터페이스에 Web property를 추가.

STDMETHODIMP CUIObj::get_Web(IUnknown **pVal)
{
        m_spBrowser->Navigate(m_urlPath,NULL,NULL,NULL,NULL);
        return S_OK;
}

STDMETHODIMP CUIObj::put_Web(IUnknown *newVal)
{
        m_spBrowser        =        (IWebBrowser2*)newVal;
        return S_OK;
}

GoToURL()이란 메소드도 추가하여 메소드 안에서 m_spBrowser->Navigate(m_urlPath,NULL,NULL,NULL,NULL)을 호출.

멤버변수
CComPtr<IWebBrowser2>        m_spBrowser;        //IDHCtrl 에서 전달되는 인터페이스 저장
CComBSTR                m_urlPath;                //URL 저장공간

OnClick()메소드도 옮겨오기....소스복사, IDL수정....뭐 대충 이정도밖에 기억안나네ㅡ.,ㅡ

더미가 있는 단일 연결리스트로 소켓정보를 관리하는 WSAEventSelect 모델.

AcceptThread로 접속된 클라이언트의 정보를 단일 연결리스트에서 관리하고,

접속된 클라이언트는 FD_READ | FD_WRITE | FD_CLOSE 이벤트가 발생하게 되면 EventsThread에서 입출력 처리.

정상작동의 여부는 확인안함. 오백만년전 소스!!

EventsThread.zip

IEnumPins *pEnumPins;
pCap->EnumPins(&pEnumPins);
IPin *pPin;
PIN_DIRECTION PinDir;
while(pEnumPins->Next(1, &pPin, 0)==S_OK) {
        pPin->QueryDirection(&PinDir);
        if(PinDir == PINDIR_OUTPUT) {
                CComQIPtr pAMSC (pPin);
                
                int iCount, iSize;
                VIDEO_STREAM_CONFIG_CAPS scc;
                AM_MEDIA_TYPE *pmt;

                pAMSC->GetNumberOfCapabilities(&iCount, &iSize);
                
                if(sizeof(scc) != iSize)
                {
                        // This is not the structure we were expecting.
                        return E_FAIL;
                }
                // Get the first format.
                hr = pAMSC->GetStreamCaps(0, &pmt, reinterpret_cast(&scc));
                if(hr == S_OK)
                {
                        pmt->subtype = MEDIASUBTYPE_RGB24;
                        VIDEOINFOHEADER *vih = reinterpret_cast(pmt->pbFormat);
                        vih->bmiHeader.biWidth = 640;
                        vih->bmiHeader.biHeight = 480;
                        vih->bmiHeader.biSizeImage = 640*480*3;
                        pmt->lSampleSize = 640*480*3;
                        pAMSC->SetFormat(pmt);
                }

                break;
        }
}