윈도우 HANDLE 과 COM 인터페이스에 대해서.
2020. 11. 14. 12:15
C++
1. 클래스 디자인을 논하기 전에, 핸들은 래퍼이다. 2. 리소스를 관리하고 수명을 다루는 클래스 템플릿은 핸들에 의해서 컨트롤 된다. 이러한 접근 방법은 C 스타일 API에서도 그렇고, 이식성(binary portability)를 요구하는 최근의 API들과도 공통적인 사항이다. 3. 윈도우 OS를 예로 들자면, 윈도우 API는 리소스와 디바이스, 알고리즘 같은 것들을 핸들이나 COM 스타일 인터페이스 포인터의 형태로 노출시킨다. 4. 그러나 핸들은 COM 인터페이스 포인터보다는 덜 직접적으로 시스템 오브젝트를 노출한다. 5. virtual 함수를 통한 호출보다는 핸들과 함께 독립적이거나 비맴버 함수를 통한 노출을 뜻한다. 6. 핸들 객체를 직접적으로 수정할 수 없기 때문에, 클래스 템플릿을 정의하고 수..
쉐어드 포인터
2020. 11. 14. 04:01
C++
1. 쉐어드 포인터는 복사 연산, 이동 연산, 관련 생성자 모두를 지원한다. 2. 레퍼런스 카운팅을 통해서 객체의 소멸을 관리한다는 점에서, ComPtr과 비슷하게 보일 수 있으나, 내부적으로는 전혀 그렇지 않다. 가령 ComPtr를 통해서 ID3D11Device 객체를 ID3D11Device3 에 할당한다면, invasive 레퍼런스 카운팅에 의해서 객체의 복사, 이동이 자유롭게 일어나지만, shared_ptr은 COM 객체에 대해서 non-invasive이기 때문에, 불가능하다. 3. 유니크 포인터와 마찬가지로 make_shared 헬퍼 함수를 통해서 객체를 생성하는 것이 좋다. 4. 레퍼런스 카운팅이 0이 되는 것은 의미가 없다. #include "Precompiled.h" #include usin..
유니크 포인터
2020. 11. 13. 22:47
C++
1. 원시 포인터를 대체할 수 있는 좋은 수단은 유니크 포인터이다. 2. 유니크 포인터는 오토 포인터와 달리, 복사 생성자, 복사 할당 연산, 이동 생성자, 이동 할당을 지원하지 않기 때문에, 오류 발생 위험이 훨씬 적다. 3. 오토 포인터 대신 유니크 포인터를 사용한다. 4. 값을 할당할때는 make_unique 메소드를 사용하는 것이 오류 위험이 가장 적고, 퍼펙트 포워딩을 지원한다. #include using namespace std; auto main() -> int { //auto sp = unique_ptr{ nullptr }; //auto sp = unique_ptr{ new int {123} }; auto sp = make_unique(123); //추천하는 할당벙 } 5. 명시적으로 생성..
Trace
2020. 11. 13. 10:47
삽질/COM
1. Trace는 단순한 추적 기능을 구현하는 것을 말한다. 2. printf는 출력을 디버거로 보내지 않기 때문에 부적절하다. 3. OutputDebugString 함수는 커널을 통해서 디버거에 문자열을 전달할 수 있지만, 릴리즈 버전에서는 노출되지 않는다. 4. Event Tracing은 릴리즈 버전에서도 제어 및 활성화할 수 있는 강력한 기능을 제공하지만, 간단한 추적을 하기에는 적합하지 않다. #pragma once #include #include #include #define ASSERT _ASSERTE #ifdef _DEBUG #define VERIFY ASSERT #else #define VERIFY(expression) (expression) #endif #ifdef _DEBUG inlin..
Verify
2020. 11. 13. 06:33
삽질/COM
1. Windows API 같은 API의 일부 메소드는 불리언 값을 반환하는 Verify 매크로를 통해서, 오류 상황을 가정하여 작성되었기 때문에, Assert 만큼 엄격하지는 않다. 2. 릴리즈 버전에서 완전히 없애기 곤란한 경우, Verify 매크로를 사용하기 때문에 보조 디버그 도구로 필수적이다. 3. Handle 객체는 복사가 일어나지 않기 때문에, 아래 코드는 오류를 발생하는 코드이다. e와 e2는 같은 값을 가지기 때문에, e의 소멸자가 호출되면, e2는 존재하지 않는 주소를 가리키게 되어, e2의 소멸자는 예외를 발생시킨다. #include #include #define ASSERT _ASSERTE #ifdef _DEBUG #define VERIFY ASSERT #else #define VE..
Assertion
2020. 11. 13. 06:18
C++
1. 어서션은 함수이거나 일반적으로 매크로를 통해서 구현되었다. 2. 어서션은 런타임을 통해서도 코드가 유효한지 확인할 수 있지만, 컴파일 타임에서도 검증하는 것을 가능케한다. 3. 애플리케이션을 실행하지 않고도 프로그래머가 세운 가정이 유효한지 확인할 수 있다. 4. 런타임 어서션은 조건부로 작동하기 때문에, 릴리즈로 빌드될 때, 사라진다. 따라서 매우 유용하다. 5. 표준 C++라이브러리 는 표준 C 라이브러리 에서 Assert를 상속받았다. #include //#include /* 실행시, 디버그 에러가 출력되며 메시지 박스가 튀어나온다. 소스파일 이름과, 에러코드, 라인넘버까지 출력된다. 자동적으로 중단점이 발동된다. 또한 콘솔창에서도 같은 정보를 출력한다. */ auto main() ->int{..
ATL + Direct2D
2020. 11. 12. 05:10
삽질
ATL은 기본적으로 Win32 API에서 상속을 받았지만, 템플릿 인터페이스가 구현되어있다. 표준 c++에서 제공하지 않는 super 기능을 가지고 있어, 참으로 신기한 친구이다. #include "Precompiled.h" using namespace D2D1; using namespace Microsoft::WRL; struct SampleWindow : CWindowImpl { ComPtr m_factory; ComPtr m_target; DECLARE_WND_CLASS_EX(L"window class name", CS_HREDRAW | CS_VREDRAW, -1); BEGIN_MSG_MAP(SampleWindow) MESSAGE_HANDLER(WM_PAINT, PaintHandler) MESSAG..
ATL 스켈레톤 윈도우
2020. 10. 30. 23:11
삽질
ATL은 Win32api에 C++의 템플릿 인터페이스와 람다를 장착한 wrapper 라이브러리이다. //main.cpp #include "Precompiled.h" typedef LRESULT(*message_callback) (HWND, WPARAM, LPARAM); struct message_handler { UINT message; message_callback handler; }; static message_handler s_handler[] = { { WM_PAINT, [](HWND window, WPARAM, LPARAM) -> LRESULT { PAINTSTRUCT ps; BeginPaint(window, &ps); OutputDebugString(L"PAINT"); EndPaint(wind..