Search

'분류 전체보기'에 해당되는 글 113건

  1. 2007.04.16 COblist is not safe on Thread
  2. 2007.04.03 GetPrivateProfileString() WritePrivateProfileString()
  3. 2007.03.31 지나가다 주워들은 말
  4. 2007.03.29 Invoke 오버라이드

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 에 "어서오세요" 가 복사됩니다.





지나가다 주워들은 말

FreeBoard 2007. 3. 31. 01:16 Posted by HisPark
위에서 새로운 프로그램 개발이나 기능 추가/수정등을 요구하면서 가능한지를 묻습니다.

그럴때 전 가장 크게 두가지를 고려해서 대답을 합니다.

첫째, 기술적으로 불가능한 경우 안된다고 대답합니다.
이건 당연한 경우겠죠?

둘째, 기간내에 마치지 못할거 같다고 판단되면 안된다고 대답합니다.
보통 기간내에 마치지 못할거 같은경우에 보통 이렇게 얘기 하죠
상사 : "이 프로그램 이렇게, 저렇게.. 기타등등으로 수정하는게 xx일 까지 가능하냐??"
개발자: "아.. 가능은 한데요.. 좀 오래걸릴거 같아요..아무래도.. 이런저런 이유로 금방은 힘들거 같은데요.."
상사 : "음.. 그래? 그럼..(xx+y)정도면 댈까? 그때까지 해놔..."
개발자: "!$#@#$%@$%^"

제 경우는
상사 : "이 프로그램 이렇게, 저렇게.. 기타등등으로 수정하는게 xx일 까지 가능하냐??"
나 : "아.. 그건 못합니다.!"
상사: "왜?"
나: "xx일까지 일을 끝내는건 불가능합니다."
상사: "그래? 음.. 그럼 언제까지 가능한지 한번 검토해바.."

이런식이죠..
물론 위의 대화에서도 개발자에게 검토하라고 말할 수도 있지만 그런경우는 드물죠..
벌써 상사가 생각하기엔 "니가 밤만 조금 새면 대겠네.."라는 식의 느낌으로 받아들이기때문입니다.
안되는것은 안된다고 단호하게 말해야 위에서도 다시한번 생각하게 됩니다.


많은 개발자 분들이 새로운 일을 맡게되면 시간만 좀 더 주어지면 가능하다는 식으로 말하는데
(아마도 그렇게 말하는 이유는 자존심이나 웬지 기술이 떨어지는 사람으로 보지는 않을까 하는 걱정때문이 아닌가 생각이 듭니다)
그건 스스로가 무덤을 파는거라 생각합니다. (저도 전에는 그랬죠.. ㅋ)
주어진 시간에 안되는거라면 "안되는"거라고 말을 해야합니다.
가능은 한데 시간을 조금을 더 달라고 말하는것과...
그것은 안된다고 말하는것은 비슷한 얘기지만 엄청난 차이가 있습니다.

만약 가능은 한데 시간을 더 달라고 해서 작업을 시작하게 되면
그 일이 끝날때 까지는 계속 언제 끝나냐는 독촉을 받게 될것입니다.
하지만 내가 충분히 생각을 하고 스케줄을 내어 그에 맞춰 개발을 한다면 맘 편히 개발을 할 수 있겠죠.


"황경민"님의 경우도 주어진 시간에 주어진 기능이 힘들거라 생각든다면 안된다고 말씀하세요.
만약 시간이 문제가 되지 않는 경우라면 어쩔수 없습니다.. 해야죠..

개발자가 하는일이라는게 원래 하이에나 같거든요.. ^^
  

'FreeBoard' 카테고리의 다른 글

너구리?  (0) 2012.11.21
나영군 기사  (1) 2006.11.10
lecture  (0) 2006.03.10
о³°`"″´·,\(´ ∇`)ノ,·´″"`°³о  (0) 2005.10.01
음... ㅡ,.ㅡ  (0) 2004.02.21

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);

이렇게 추가 해주시면 됩니다..