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..
COM study note 8 IUnknown C# 버전
2020. 10. 30. 12:12
삽질/COM
1. COM은 바이너리 스탠다드이다. 그러나 CLR은 좀더 상위 레벨에서 COM을 보조하는 역활을 한다. 2. 그럼에도 CLR은 완벽하지 않아서, 직접 C++과 C#의 갭을 메우는 짓이 필요하다. using System.Runtime.InteropServices; [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] [Guid("26e278ff-5641-46da-94b3-1da3f19b315a")] interface IHen { [PreserveSig] void Cluck(); [PreserveSig] void Roost(); } [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] [Guid("06845df9-7bb9..
COM study note 8 IUnknown 이식
2020. 10. 30. 00:06
삽질/COM
GUID는 COM 인터페이스를 위한 식별자이다. 128bit Globally unique identifier UUID IID CLSID 도 결국엔 GUID 임 1 Library 헤더에 이식하기 위해서, PowerShell 에서 uuid를 생성한다음 클립보드에 복사한다. uuidgen | clip 2. uuid로 인터페이스 구조체를 수정한다. //Library.h #pragma once #include struct __declspec(uuid("26e278ff-5641-46da-94b3-1da3f19b315a")) IHen : IUnknown { virtual void __stdcall Cluck() = 0; virtual void __stdcall Roost() = 0; }; struct __declsp..
COM study note 7
2020. 10. 29. 17:01
삽질/COM
1. HRESULT는 그냥 long 혹은 signed long int 이다. (32bit) Severity code(1bit) : Success or Fail Facility code(11bit) : application 에러보다는 Infrastructure 에러와 연관된 부분 Status code(16bit) : 실질적인 에러 코드 //관련 매크로 #define SUCCEEDED(hr) ((HRESULT)(hr) >= 0) #define FAILED(hr) ((HRESULT)(hr) < 0) //매크로 안쓴는 버전 if(S_OK == hr) ... if(S_OK !+ hr) ... struct ComException { HRESULT error; ComException(const HRESULT hr) ..
COM study note 6 인터페이스 상속
2020. 10. 28. 17:47
삽질/COM
1. 다이아몬드 상속을 받는 경우, 문제를 야기할 수 있지만, 명시적으로 캐스팅을 함으로써 문제를 해결한다. //Library.h #pragma once struct IObject { virtual void __stdcall Addref() = 0; virtual void __stdcall Release() = 0; virtual void* __stdcall As(const char* type) = 0; }; struct IHen : IObject { virtual void __stdcall Cluck() = 0; virtual void __stdcall Roost() = 0; }; struct IHen2 : IHen { virtual void __stdcall Forage() = 0; }; struct..
COM study note 5 레퍼런스 카운터
2020. 10. 28. 13:18
삽질/COM
1. 이런 저런 오류를 피하기 위해서, COM 객체를 레퍼런스 카운터를 통해서 수명 관리하는 것이 국룰이다. 2. 인터페이스를 만들고 구현은 파생에서 하도록 한다. //Library.h #pragma once struct IHen { virtual void __stdcall Cluck() = 0; virtual void __stdcall Roost() = 0; virtual void __stdcall Addref() = 0; virtual void __stdcall Release() = 0; }; IHen* __stdcall CreateHen(); 3. 멤버 변수로 레퍼런스 카운터를 추가하고, 초기화는 유니폼으로 하는 것이 국룰이다. Release에서는 레퍼런스 카운터가 0이 되면 인스턴스를 자동으로 삭..
COM study note 4 인터페이스
2020. 10. 27. 21:36
삽질/COM
What the designers of COM discovered was virtually all of the C++ compilers on the Windows platform happened to implement virtual functions in the same way. This was key discovery. They then decided to take this coincidence as a blessing and use it as the basis for COM's interface inheritance, which enables polymophism and COM's version of object-oriented programming. COM also expects methods to..