본문 바로가기
Programming/Tips(C++,C#)

0119

by 곰네Zip 2009. 1. 19.


*CriticalSection, Mutex, Semaphore, Event : Kernel Object. (Ring 0에서 의미있음)
        + ::WaitForSingleObject(), ::WaitForMutexObject(); 이건 Barrier임
        자기 자신의 종료 이벤트도 기다린다.

*InitInstance의 시작부분이 실행에 필요한 것을 로딩한다.

*CEvent EventUpdate(FALSE,FALSE,_T("EVENT_NPS_UPDATE"));
 ::WaitForSingleObject(EventUpdate.m_hObject, INFINITY);
 CWnd* pMain = AfxGetMainWnd();
 ::PostMessage(pMain->m_hWnd, UM_UPDATEAPP);
or
  CWinApp* pApp = AfxGetApp();
  ::PostMessage(pApp->m_pMainWnd->m_hWnd, UM_UPDATEAPP,NULL,NULL);
 위와같이 작성한다.

*Event만들기
 ::CreateEvent();
 ::OpenEvent(); //이벤트가 이미 존재한다면... Open을 해야한다. Create는 중복이 안된다.
 CloseHandle해주어야함.

 CEvent개체

*스레드사용할때 웬만하면 AfxBeginThread()를 쓰는편이 낫다.
CRuntimeLibrary를 사용한다면 _BeginThread를 수행하는편이 낫다.

CreateThread = Thread핸들 가져옴. 이걸 사용후에는 Close해주어야함.
그러나 AfxBeginThread 는 알아서 delete가 된다.

*CreateProcess : Win32 Base API로만 개발할 것.

*중복실행 검사하기
InitInstance(){
   m_hdupCheck = ::CreateEvent(NULL,FALSE,FALSE,_T(GUID));
   if( (m_hdupCheck == NULL) && ( ::GetLastError() == ERROR_ALREADY_EXISTS) ){
    //원래윈도우 활성화시키기
    return FALSE;
   }
}

//윈도우 활성화
  윈도우 이벤트를 찾아서 하거나 아니면 윈도우 핸들을 찾는다.
  =>event로 설정한것은 현재 세션에서만 유용한 방법이 된다.
 만약 시스템에서 유일하고싶다 : Global\\을 붙여야한다. (서비스 프로세스도 마찬가지다. 이거는 거의 자동이다.) 이것은 오브젝트의 세션범위를 지정해주는것이다.

*HANDLE은 최대한 많이 줄이자. => 오버헤드 쩐다.
*GetLastError() : 현재 스레드에서 마지막으로 실행한 API를 기준으로한다.

*Unicode :
  1) "Text" : 일반 char모드 => char   a[10] => t e s t 0
  2) L"Text" : Unicode모드 => wchar b[20] => t 0 e 0 s 0 t 0 0 << 이렇게 저장됨, 0은 NULL

 Window Kernel은 유니코드를 사용한다. => 소프트웨어도 유니코드로하면 성능차이난다. 서버는 치명적이기도 함.

 TCHAR => ASCII일수도 있고, Unicode일수도 있다.

*윈도우 시스템쪽 프로그램짜면 CString사용 주의. 버그있음
 공간 재할당시 free안하는경우 있음.

*::NetUserGetInfo(param): 사용자 정보퍼오기.
if( ::NetUserGetInfo(NULL,Text,2,(LPBYTE*)&pUserInfo) == NERR_Success)
...
::NetApiBufferFree(pUserInfo); pUserinfo :에다 퍼온것을 공간할당해제하자.

::WideCharToMultiByte

CRuntimeLibrary : 사용하려면 주의해라.

반응형

댓글