본문 바로가기

프로그래밍12

goto 대신에 do { ... } while (false)를 사용한 에러처리 C/C++ 코딩을 하다보면 흔히 아래와 같은 에러처리 코드를 만나게 된다. ... if (!condition1) goto cleanup; ... if (!condition2) goto cleanup; ... if (!condition3) goto cleanup; ... if (!condition4) goto cleanup; ... cleanup: // 메모리 해제등의 정리 작업 고급 언어에서는 goto를 사용하지 말라고 많이 하고 실제 goto의 사용이 스파게티 코드를 만드는 경우가 많기 때문에 사용하지 않는 것이 좋지만 C/C++에서는 finally를 지원하지 않기 때문에 위와 같은 코드는 묵인해주는 경우가 많다. 그래도 goto를 피하고 싶기 때문에 아래처럼 하기도 한다. ... if (!condit.. 2010. 3. 25.
Visual C++ 2005 CRT DLL 버전 충돌 문제 VS2005 CRT DLL(msvcp80.dll, msvcr80.dll)을 사용하는 COM 모듈을 개발할 때 설치 대상 PC에 .NET 2.0 SP1이나 .NET 3.0 SP1이 설치되어 있는 경우 COM 등록 시에 로드하는 CRT DLL 버전 8.0.50727.762를 side by side assemblies 기능에서 자동으로 8.0.50727.1433으로 리다이렉트해준다. 문제는 1433 버전으로 작동하는 경우 COM 등록이 안 되는 등의 에러가 발생한다. Isolated COM이나 Per-application Configuration(Windows XP, Windows Vista)으로도 해결할 수 있지만 가장 간단한 방법은 Private Assemblies로 항상 762 버전을 사용하도록 하는 것.. 2008. 9. 30.
크리티컬 섹션을 이용한 스레드 동기화 다중 스레드 환경의 프로그램에서 여러 스레드 사이에서 공유하는 리소스를 사용한다면 반드시 스레드 간 동기화를 해줘야 한다. Windows 환경이라면 스레드 동기화를 위해서 가장 많이 사용하는 동기화 방법은 크리티컬 섹션일 것이다. // 크리티컬 섹션 변수 CRITICAL_SECTION cs; // 크리티컬 섹션 초기화 InitializeCriticalSection(&cs); // 공유 리소스를 사용하는 스레드 사용 ... // 모든 스레드가 종료된 후 크리티컬 섹션 삭제 DeleteCriticalSection(&cs) DWORD WINAPI ThreadProc(LPVOID pParam) { ... // 크리티컬 섹션 소유권 가져오기 EnterCriticalSection(&cs); // 공유 리소스에 접근.. 2007. 12. 18.
실행 중인 IE창 모두 닫기 현재 실행 중인 IE창을 모두 닫습니다. BOOL CALLBACK EnumWindowsProc(HWND hWnd, LPARAM lParam) { TCHAR szClassName[256]; if (GetClassName(hWnd, szClassName, 256) > 0) { if (_tcsicmp(szClassName, _T("IEFrame")) == 0) PostMessage(hWnd, WM_CLOSE, 0, 0); } return TRUE; } ... EnumWindows(EnumWindowsProc, 0); ... 2007. 12. 14.
VC6의 CHtmlView 버그 VC6의 CHtmlView에는 버그가 있어서 텍스트 입력에서 Tab, Del, Enter 키등이 동작하지 않는다. VC7이상의 CHtmlView에서는 버그가 수정되었는데 PreTranslateMessage()를 오버라이딩함으로 해결하였다. VC6에서 해당 버그를 수정하려면 CHtmlView를 상속해서 VC7의 CHtmlView::PreTranslateMessage()로 PreTranslateMessage()를 오버라이딩하면 된다. BOOL CHtmlView::PreTranslateMessage(MSG* pMsg) { ASSERT(pMsg != NULL); ASSERT_VALID(this); ASSERT(m_hWnd != NULL); // allow tooltip messages to be filtered.. 2007. 9. 5.
Visual C++로 XPCOM 컴포넌트 만드는 방법 모질라 파이어폭스에서 사용하기 위한 XPCOM 컴포넌트를 만들기 위해서 Visual C++를 사용할 수 있는 방법에 대한 설명입니다. 일반적으로 XPCOM을 만드는 경우 GCC를 많이 사용하겠지만 Windows 환경이라면 역시 Visual C++을 이용해서 XPCOM을 만들 수 있다면 더 편리할 것입니다. 모질라 개발자 사이트에 있는 내용을 참고하였고 XPCOM 개발에 대한 기본적인 지식이 있는 것으로 전제합니다. XPCOM에 대한 자세한 내용은 Mozilla Developer Center를 참고하시기 바랍니다. 개발 환경 설정 먼저 Visual C++이 설치되어 있어야 합니다. Microsoft에서 무료로 배포하는 Visual C++ Express를 사용할 수도 있습니다. 여기서는 Visual C++ .. 2007. 7. 19.