COblist is not safe on Thread

Program Visual C++ 2007. 4. 16. 13:26 Posted by HisPark
COblist is not safe on Thread


CConnectThread* pThread;        

POSITION pos = m_ThreadList.GetHeadPosition();

주의요!
GetPrivateProfileString()  

GetPrivateProfileString(),WritePrivateProfileString()



ini 형식의 파일을 읽고 쓰기 편하게 만들어 놓은 API 입니다.
( 예전에 레지스트리가 없는 윈도우 시절에는 시스템 설정도 ini 를 이용했습니다)

kkk.ini 라는 파일에 아래와 같은 내용이 있을 때에
-----------------------------------------------------------------------------------------
[AAA]
a1=안녕하세요
a2=안녕히 계세요

[BBB]
b1=어서오세요
b2=GG
-----------------------------------------------------------------------------------------

아래처럼 함수를 호출하면
-----------------------------------------------------------------------------------------
TCHAR buf[256];
GetPrivateProfileString("BBB", "b1", "", buf, 256, "kkk.ini");
-----------------------------------------------------------------------------------------

buf 에 "어서오세요" 가 복사됩니다.





Invoke 오버라이드

Program Visual C++ 2007. 3. 29. 20:28 Posted by HisPark
STDMETHODIMP CIEHlprObj::Invoke(DISPID dispidMember, REFIID riid,

                                LCID lcid, WORD wFlags,

                                DISPPARAMS* pDispParams,

                                VARIANT* pvarResult,

                                EXCEPINFO*  pExcepInfo, UINT* puArgErr)

{

   USES_CONVERSION;

   strstream strEventInfo;



   if (!pDispParams)

      return E_INVALIDARG;



   //

   // Get the current URL.

   //  

   LPOLESTR lpURL = NULL;

   m_spWebBrowser2->get_LocationURL(&lpURL);



   switch (dispidMember)

   {

      //

      // The parameters for this DISPID are as follows:

      // [0]: Cancel flag  - VT_BYREF|VT_BOOL

      // [1]: HTTP headers - VT_BYREF|VT_VARIANT

      // [2]: Address of HTTP POST data  - VT_BYREF|VT_VARIANT

      // [3]: Target frame name - VT_BYREF|VT_VARIANT

      // [4]: Option flags - VT_BYREF|VT_VARIANT

      // [5]: URL to navigate to - VT_BYREF|VT_VARIANT

      // [6]: An object that evaluates to the top-level or frame

      //      WebBrowser object corresponding to the event

      //

      case DISPID_BEFORENAVIGATE2:

         strEventInfo << "BeforeNavigate2: ";



         if (pDispParams->cArgs >= 5 &&

             pDispParams->rgvarg[5].vt == (VT_BYREF|VT_VARIANT))

         {

            CComVariant varURL(*pDispParams->rgvarg[5].pvarVal);

            varURL.ChangeType(VT_BSTR);



            strEventInfo << OLE2T(varURL.bstrVal);

         }

         else

            strEventInfo << "NULL";



         strEventInfo << ends;

         break;



      //

      // The parameters for this DISPID:

      // [0]: URL navigated to - VT_BYREF|VT_VARIANT

      // [1]: An object that evaluates to the top-level or frame

      //      WebBrowser object corresponding to the event

      //

      case DISPID_NAVIGATECOMPLETE2:

         if (pDispParams->rgvarg[0].vt == (VT_BYREF|VT_VARIANT))

         {

            CComVariant varURL(*pDispParams->rgvarg[0].pvarVal);

            varURL.ChangeType(VT_BSTR);

  

            strEventInfo << "NavigateComplete2: "

                         << OLE2T(varURL.bstrVal)

                         << ends;

         }

         break;



      //

      // The parameters for this DISPID:

      // [0]: New status bar text - VT_BSTR

      //

      case DISPID_STATUSTEXTCHANGE:

         LPOLESTR lpStatusText;



         m_spWebBrowser2->get_StatusText(&lpStatusText);

         strEventInfo << "StatusTextChange: ";



         if (!strcmp(OLE2T(lpStatusText), ""))

            strEventInfo << "NULL";

         else

            strEventInfo << OLE2T(lpStatusText);



         strEventInfo << ends;

         break;



      //

      // The parameters for this DISPID:

      // [0]: Maximum progress - VT_I4

      // [1]: Amount of total progress - VT_I4

      //

      case DISPID_PROGRESSCHANGE:

         strEventInfo << "ProgressChange: ";



         if (pDispParams->cArgs == 0)

            strEventInfo << "NULL";

         else

         {

            if (pDispParams->rgvarg[0].vt == VT_I4)

               strEventInfo << pDispParams->rgvarg[0].lVal;



            if (pDispParams->cArgs > 1 &&

                pDispParams->rgvarg[1].vt == VT_I4)

            {

               strEventInfo << ", " << pDispParams->rgvarg[1].lVal;

            }

         }



         strEventInfo << ends;

         break;



      case DISPID_DOCUMENTCOMPLETE:

         strEventInfo << "DocumentComplete" << ends;

         break;



      case DISPID_DOWNLOADBEGIN:

         strEventInfo << "DownloadBegin" << ends;

         break;



      case DISPID_DOWNLOADCOMPLETE:

         strEventInfo << "DownloadComplete" << ends;

         break;



      //

      // The parameters for this DISPID:

      // [0]: Enabled state - VT_BOOL

      // [1]: Command identifier - VT_I4

      //

      case DISPID_COMMANDSTATECHANGE:

         strEventInfo << "CommandStateChange: ";



         if (pDispParams->cArgs == 0)

            strEventInfo << "NULL";

         else

         {

            if (pDispParams->rgvarg[0].vt == VT_BOOL)

            {

               strEventInfo << ((pDispParams->rgvarg[0].boolVal ==

                                 VARIANT_TRUE) ? "True" : "False");

            }



            if (pDispParams->cArgs > 1 &&

                pDispParams->rgvarg[1].vt == VT_I4)

            {

               strEventInfo << ", " << pDispParams->rgvarg[1].lVal;

            }

         }



         strEventInfo << ends;

         break;



      case DISPID_NEWWINDOW2:

         strEventInfo << "NewWindow2" << ends;

         break;



      //

      // The parameters for this DISPID:

      // [0]: Document title - VT_BSTR

      //

      case DISPID_TITLECHANGE:

         strEventInfo << "TitleChange: ";



         if (pDispParams->cArgs > 0 &&

             pDispParams->rgvarg[0].vt == VT_BSTR)

         {

            strEventInfo << OLE2T(pDispParams->rgvarg[0].bstrVal);

         }

         else

         {

            strEventInfo << "NULL";

         }



         strEventInfo << ends;

         break;



      //

      // The parameters for this DISPID:

      // [0]: Name of property that changed - VT_BSTR

      //

      case DISPID_PROPERTYCHANGE:

         strEventInfo << "PropertyChange: ";



         if (pDispParams->cArgs > 0 &&

             pDispParams->rgvarg[0].vt == VT_BSTR)

         {

            strEventInfo << OLE2T(pDispParams->rgvarg[0].bstrVal);

         }

         else

         {

            strEventInfo << "NULL";

         }



         strEventInfo << ends;

         break;



      //

      // The parameters for this DISPID:

      // [0]: Address of cancel flag - VT_BYREF|VT_BOOL

      //

      case DISPID_QUIT:

         strEventInfo << "Quit" << ends;



         ManageConnection(Unadvise);

         m_dlgEvents.DestroyWindow();

         break;



      default:

         strEventInfo << "Unknown Event" << dispidMember << ends;

         break;

   }



   m_dlgEvents.AddEventToList(strEventInfo.str());



   return S_OK;

}

이게 오버라이드 한 예제구요.. cpp 에 추가 하시구 헤더파일 클래스 안에다가

STDMETHOD(Invoke)(DISPID dispidMember, REFIID riid,

                     LCID lcid, WORD wFlags,

                     DISPPARAMS * pdispparams, VARIANT * pvarResult,

                     EXCEPINFO * pexcepinfo, UINT * puArgErr);

이렇게 추가 해주시면 됩니다..
// 웹페이지에 있는 javascript 함수를 호출한다.

    m_pIWeb = GetIWebPointer();

    IDispatch *pDisp=NULL;

    VARIANT varRet;

    m_pIWeb->get_Document(&pDisp);

    IHTMLDocument2* pHtmlDoc = (IHTMLDocument2*)pDisp;

    IHTMLWindow2* pHtml;

    pHtmlDoc->get_parentWindow(&pHtml);



    CString sFunc = "func_control_call();";

    BSTR pbFunc = sFunc.AllocSysString();

    CString sLang = "javascript";

    BSTR pbLang = sLang.AllocSysString();

    pHtml->execScript(pbFunc, pbLang, &varRet);

    pDisp->Release();

   // ------------------------------------------------------------



IWebBrowser2* CClockCtrl::GetIWebPointer()        // 브라우저 포인터 얻기.

{

    HRESULT hr ;

    IOleContainer *pIContainer = NULL ;

    IWebBrowser2 *pIWeb = NULL ;

    IServiceProvider *pISP = NULL ;

    

    // Get IOleClientSite interface pointer.

    LPOLECLIENTSITE pIClientSite = GetClientSite() ;

    

    // Get IOleContainer interface poineter.

    hr = pIClientSite->GetContainer(&pIContainer) ;

    if (hr != S_OK) {

        pIClientSite->Release() ;

        return NULL ;

    }

    

    // Get IServiceProvider interface pointer.

    hr = pIClientSite->QueryInterface(IID_IServiceProvider,

        (void **)&pISP) ;

    if (hr != S_OK) {

        pIContainer->Release() ;

        pIClientSite->Release() ;

        return NULL ;

    }



    // Get IWebBrowser2 interface pointer.

    hr = pISP->QueryService(IID_IWebBrowserApp,

        IID_IWebBrowser2,(void**)&pIWeb) ;

    if (hr != S_OK) {

        pIContainer->Release() ;

        pIClientSite->Release() ;

        pISP->Release() ;

        return NULL ;

    }

    // release interface.

    pIContainer->Release() ;

    pIClientSite->Release() ;

    pISP->Release() ;

    return pIWeb ;

}