|
나이스 님이 쓰신 글 :
: 디자인타임 패키지 소스를 분석하고 있는데 아무리 찾아봐도 Register 함수가 보이지 않습니다.
: 제가 알고 있기로는 컴포넌트를 등록하기 위해선 Register 함수가 반드시 필요한 것으로 알고있습니다.
: 그런데 아무리 찾아봐도 디자인타임 패키지 소스코드에서 Register 함수가 전혀 보이지 않습니다.
:
: 런타임 패키지라면 Register 함수가 필요없지만 디자인타임 패키지에서 Register 함수가 없는게
: 가능한 건가요. 전혀 이해를 하지 못하고 있습니다. 고수님들의 한수 부탁 드립니다.
답변:
나이스님이 보고있는 소스코드에...
IOTAModuleCreator, IOTAGalleryCategory, IOTAEditorServices, IBorlaIOTAProject 등의 COM Interface 가
있는지 확인해 보세요.
위와 비슷한 Interface 정의가 보인다면.. 나이스님이 보고있는 디자인타임 패키지는 아마도 IDE 확장과 관련된
패키지 소스일 겁니다.
익스텐션 모듈은 IDE의 어드레스 공간에서 같은 컨텍스트로 돌아가기 때문에 Dynamic Load가 가능한 패키지
형식이라야 합니다. 런타임 패키지도 Dynamic Load가 가능한 형식이지만, 익스텐션 모듈은 사용자 애플리케이션
에 의해서 사용되는 모듈이 아니고, IDE에 의해서 사용되기 때문에.. 익스텐션 모듈을 구현할 때 디자인타임 패키지
형식으로 구현하게 됩니다.
익스텐션 모듈에서 사용자가 Register 함수를 정의해서, 예를들면... Register 바디에 RegisterPackageWizard
를 호출하는 식으로 명시적으로 패키지를 등록하는 것도 가능하지만... DsgnIntf, ToolsApi 등의 IDE 확장과
관련된 유닛을 포함하게 되면, 컴파일러가 패키지 바이너리의 Export 섹션에 PackageLoad, PackageUnload
엔트리를 생성합니다. 그리고 컴파일러가 코드를 생성할 때... PackageInfoTable이란 자료구조도 바이너리에
생성해 주게되는데... IDE의 패키지 로더에 의해서 익스텐션 모듈의 PackageLoad가 호출 될 때.. 익스텐션 모듈은
컴파일러가 생성해준 PackageInfoTable을 인자로 해서 넘겨주게 됩니다.
이런 식으로 패키지 로더는 컴파일러가 생성한 익스텐션 모듈의 PackageInfoTable의 위치를 알수 있게되고...
PackageInfoTable에는 익스텐션 모듈 소스코드에서 정의되어있는 모든 class, method에 대한 정보는 물론..
virtual method table 등에 관한 정보도 포함되어 있기 때문에(확장된 RTTI죠) 익스텐션 모듈에서 정의되어 있는
Interface를 다이나믹하게 생성해서... 모듈에서 구현하고 있는 Interface를 IDE에 제공할 수도 있고... IDE가 제공
하는 Interface 서비스를 모듈에서 사용할 수도 있게 됩니다.
IDE와 익스텐션 모듈간에 Provider/Consumer, 또는 그 반대로 Consumer/Provider 관계가 되기도 하는 거죠.
그리고...
IDE 익스텐션 모듈을 반드시 디자인타임 패키지 형태로 구현해야만 하는 것은 아닙니다. 일반 DLL 형식으로 구현
할 수도 있는데요. 오히려 이 형태로 구현하는 게... 사용자가 IDE에서 마음대로 패키지를 Install/Uninstall 하는
것을 못하게 할수 있기 때문에 더 나은 선택이 될수도 있습니다. 패키지가 아닌 DLL형식으로 구현할 경우, IDE가
사용하는 레지스트리에 DLL 패스를 등록해주면 IDE가 시작할 때 자동으로 모듈이 올라오게 됩니다.
|