*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 : 사용하려면 주의해라.
Programming/Tips(C++,C#)
0119
반응형
댓글