티스토리 툴바


IWebBrowser2 사용 시 navigate 후 화면이 이전 화면 또는 흰색으로 표시되는 경우가 있다. 물론 해당 url은 이미 로딩이 완료된 상태이고 윈도우를 리사이즈하거나 액션을 통해 갱신을 하는 경우 제대로 표시가 된다.

위와 같은 이슈의 근본적인 원인은 찾아내지 못했다.
강제로 painting 처리를 해주고 메시지를 날려주고 별 짓을 다 했지만 정상처리가 되지 않았고 어렴풋이 원인으로 보이는 부분은 해당 url의 캐시가 남아 있는 경우 즉 처음 로딩하는 페이지가 아닌 경우 자주 발생했다.

host window의 OnPaint 시점과 OnDocumentComplate 시점의 차이로 간주하고 OnDocumentComplete에서 강제로 UpdateWindow() 함수를 호출 하는 것으로 이슈는 마무리 했다.

하지만 근본적인 원인을 파악하지 못했기에 여전히 찝찝한 기분이다. 
저작자 표시 비영리 변경 금지
Posted by ancdesign
PassThroughAPP 사용 시 HTTP 응답에 대한 cookie 정보를 얻을 수 있다.

PassThroughAPP를 상속받아 HttpFilterSink를 구현 할 때 
// IInternetProtocolSink
STDMETHODIMP ReportProgress(/* [in] */ ULONG ulStatusCode, /* [in] */ LPCWSTR szStatusText);
해당 함수를 재정의 하여 처리한다.

ReportProgress에서 ulStatusCode값이 다음과 같은 경우
 BINDSTATUS_COOKIE_STATE_ACCEPT, BINDSTATUS_COOKIE_STATE_LEASH  

HTTP_QUERY_RAW_HEADERS로 헤더 정보를 얻어와 "Set-Cookie:" 로 쿠키 정보를 찾아서 입맛에 맞게 처리하면 된다.

더보기

 
저작자 표시 비영리 변경 금지
Posted by ancdesign
IWebBrowser2 사용 시 현재 포커스가 있는 Element를 얻어오는 코드 조각


HRESULT ClassName::GetActiveElement(IHTMLElement** element0)
{
    if (!element0) return E_INVALIDARG;

    HRESULT hr = E_FAIL;
    if (*element0) *element0 = NULL;
    CComQIPtr<IDispatch> dispatch;
    hr = (*this)->get_Document(&dispatch);
    if (SUCCEEDED(hr) && dispatch)
    {
        CComQIPtr<IHTMLDocument2> document2(dispatch);
        dispatch.Release();
        while (document2)
        {
            CComQIPtr<IHTMLElement> element;
            hr = document2->get_activeElement(&element);
            document2.Release();
            if (SUCCEEDED(hr))
            {
                CComBSTR tagname;
                element->get_tagName(&tagname);
                tagname.ToUpper();
                if (tagname == _T("FRAME") || tagname == _T("IFRAME"))
                {
                    CComQIPtr<IWebBrowser2> webBrowser(element);
                    if (webBrowser)
                    {
                        hr = webBrowser->get_Document(&dispatch);
                        dispatch->QueryInterface(IID_IHTMLDocument2, (void**)&document2);
                        dispatch.Release();
                    }
                }
                else
                {
                    *element0 = element.Detach();
                }
            }
        }
    }
    return hr;
}
저작자 표시 비영리 변경 금지
Posted by ancdesign
Personality2011/08/29 10:13
가족관계 한자 표기

관계

한글

한자

아버지

父 (아비 부)

어머니

母 (어미 모)

남편

夫 (지아비 부)

부인

婦 (아내 부)

여동생

妹 (손아랫누이 매)

누나

姉 (손윗누이 자)

형님

兄 (맏 형)

남동생

弟 (아우 제)

할머니

조모

祖母 (조상 조, 어미 모)

할아버지

조부

祖父 (조상 조, 아비 부)

 

  
Posted by ancdesign
template<typename Char> struct CaseInsensitiveCompare {
 public:
  bool operator()(Char x, Char y) const {
    return tolower(x) == tolower(y);
  }
};

std::wstring GetFaviconUrlFromDocument(IHTMLDocument2* doc2)
{
    if (!doc2)
    {
        return std::wstring();
    }
    static std::wstring const linktag = L"LINK";

    CComPtr<IHTMLElementCollection> ielemCol;
    CComPtr<IHTMLLinkElement> lnkelem;
    if (FAILED(doc2->get_all(&ielemCol)))
    {
        return std::wstring();
    }
    CComPtr<IDispatch> displink;
    CComQIPtr<IHTMLElement, &IID_IHTMLElement> ielem;
    if (FAILED(ielemCol->tags(CComVariant(linktag), &displink)))
    {
        return std::wstring();
    }
    if (FAILED(displink->QueryInterface(IID_IHTMLElementCollection, (void**)&ielemCol)))
    {
        return std::wstring();
    }
    long count = 0;
    if (FAILED(ielemCol->get_length(&count)))
    {
        return std::wstring();
    }

    CComPtr<IDispatch> dispEnum;
    for (long i=0; i<count; i++)
    {
        CComVariant index = i;
        if (SUCCEEDED(ielemCol->item(index, index, &dispEnum)))
        {
            ielem = dispEnum;
            CComBSTR bstr;
            if (SUCCEEDED(ielem->get_tagName(&bstr)))
            {
                std::wstring tag = bstr;
                if (tag.length() == linktag.length() &&
                    std::equal(tag.begin(), tag.end(), linktag.begin(), CaseInsensitiveCompare<wchar_t>()))
                {
                    if(SUCCEEDED(ielem->QueryInterface(IID_IHTMLLinkElement, (void**)&lnkelem)) && lnkelem)
                    {
                        if(SUCCEEDED(lnkelem->get_rel(&bstr)))
                        {
                            std::wstring rel = bstr;
                            std::wstring shortcut_icon(L"shortcut icon");
                            if (rel.length() == shortcut_icon.length() &&
                                std::equal(rel.begin(), rel.end(), shortcut_icon.begin(), CaseInsensitiveCompare<wchar_t>()))
                            {
                                if(SUCCEEDED(lnkelem->get_href(&bstr)))
                                {
                                    std::wstring url = bstr;
                                    return url;
                                }
                            }
                        }
                    }
                }
            }
        }
    }

    return std::wstring();
 }
저작자 표시 비영리 변경 금지
Posted by ancdesign
하이쿠2011/06/15 09:10

저작자 표시 비영리 변경 금지
Posted by ancdesign
하이쿠2011/06/14 09:34

저작자 표시 비영리 변경 금지
Posted by ancdesign
프로그래밍2011/02/09 15:16
http://gladtosee.tistory.com/archive/20090220


Posted by ancdesign
출처: byung.egloos.com/3572751


Debugging은 분석도 중요하지만, Crash Dump를 수집하거나 적절한 시점에 Debugger를 attach 하는 것도 중요합니다. 특히 이미 실행중인 Process에 WinDBG 를 attach 하거나 cdb.exe(w/ ADPLUS.vbs) 를 통해 Memory Dump를 수집하는 방법은 널리 사용되는 방법입니다만 Program이 Start 시에 Crash 를 발생하고 Terminated 되는 경우도 Debugging을 해야 할 때가 있습니다. 이 경우에는 Image File Execution options을 이용하면 유용합니다. 설정은 아래와 같이 합니다. 

 1. Regedit.exe 를 Open 합니다. 
 2. 다음의 Registry Key로 위치 합니다. 
     [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\]
 3. Subkey 로 Debugging 하고자 하는 Program의 이름을 추가합니다. (ex. MyApp.exe)
 4. 해당 subkey에 "Debugger" 라는 String(REG_SZ) 를 추가합니다. 그리고, Debugger의 Full path를 추가합니다. 
     "Debugger" = "c:\debuggers\windbg.exe"
 5. Regedit.exe 를 Close 합니다.

그러면, MyApp.exe가 실행될 때 windbg.exe 가 MyApp.exe에 attach 되어 실행됩니다.  

참조: Debugging a Windows NT Service
        Specifying the Debugger for Unhandled User Mode Exceptions
Posted by ancdesign
싱글 모니터의 경우는 다음과 같이 얻어 올 수 있다.

left = 0;
top = 0;
right = GetSystemMetrics(SM_CXSREEEN);
bottom = GetSystemMetrics(SM_CYSCREEN);

듀얼모니터의 경우 각각의 모니터 좌표가 아닌 전체 두개이상의 모니터를 합친 전체 영역의 좌표를 구할 필요가 있다.

left = GetSystemMetrics(SM_XVIRTUALSCREEN);
top = GetSystemMetrics(SM_YVIRTUALSCREEN);
right = left + GetSystemMetrics(SM_CXVIRTUALSCREEN);
bottom = top + GetSystemMetrics(SM_CYVIRTUALSCREEN);

모니터의 배치와 기본 위치에 따라서 left, top이 음수 값이 될 수 있으니 주의하도록 하자
저작자 표시 비영리 변경 금지
Posted by ancdesign