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..

COM study note 3 다이나믹 링킹
2020. 10. 27. 11:20
삽질/COM
1. Dynamic Linking 은 DLL을 통해서 코드를 패키징 하는 방법이다. 2. DLL은 C 스타일 함수를 뱉는 놈이고, 앱에서는 DLL을 자유롭게 선택이 가능하다. 3. 앱은 소스코드에 접근하지 않고도, DLL을 통해서 그 함수의 기능을 사용할 수 있다. 4. 소스코드의 내용이 길고, 드물게 사용하는 놈들은 다른 DLL에 때려박아서. 쓸데없는 메모리 흔적을 줄일 수 있다. DLL 파일 사용해보기 1. powershell을 켜봐라. 2. notepad로 Library.h, Library.cpp, Library.def 파일을 만들어보아라, notepad++ 보다는 notepad2를 사용하여야 cmd 창에서 사용할 수 있을 것이다. 내용은 아무렇게나 한다. 3. def 파일은 optional 이긴 ..
COM study note 2 역사
2020. 10. 26. 23:13
삽질/COM
1. COM 이 모양을 갖춰가던 80년대 후반, OOP의 C++과 COM은 사실 형제였다. 2. 그전까지 표준화되지 않았던 C++는 98에 이르러서 표준화되었으나, 여전히 두 가지 문제를 가지고 있었고, C#과 Java로 개발자들이 몰리면서 침체기를 맡게 된다. 3. 다른 컴포넌트에 영향을 미치지 않으면서, 라이브러리를 수정하기가 어려웠고, 운영체제와 같은 범용적으로 쓰이는 컴포넌트를 사용하는 프로세스들이 메모리에 동일한 코드를 중복적으로 저장하는 문제점이었다. 4. DLL을 사용하여 두 문제를 해결했지만, 컴파일러 호환성 문제를 발생시켰다. 5. C++ 표준은 binary 레벨에서의 표준을 의미하지는 않았지만, 모두 C에서부터 파생됐다는 공통점이 있었다. 6. C++에서 COM으로 마이그레이션 하는 것..