안녕하세요. 천리안 프로그래머 포럼 C++Builder 담당 임펠리테리입니다.
저도 지금 좀 바쁘게 되어서.. 급하시다니까 답변은 합니다만, 해결에 도움이 되실
거라고 장담은 못합니다. 그럴 수밖에 없는게, 원래 액티브엑스는 C++ 기술이기
때문에, 제가 빌더에서 해본 방법과 동일한 방법으로 델파이에서 할 수 있는지를
모르기 때문입니다. (거의 모든 분야에서 델파이와 빌더는 같은 방법으로 구현되어
있습니다만, 액티브엑스나 코바와 같은 몇가지 분야는 델파이의 오브젝트 파스칼 언어
의 한계로 인해 좀 다른 방법으로 되어있는 경우가 있습니다.)
그런 관계로.. 지금부터 빌더를 기준으로 설명해보죠.
액티브엑스 컨트롤을 만들고 있는 프로젝트에서 _TLB로 끝나는 파일을 찾아 F12키를
누르면, 현재 프로젝트의 타입라이브러리 파일(.TLB)이 나타납니다. 타입라이브러리는
액티브엑스 컨트롤로부터 필요한 프로퍼티나 이벤트, 메소드등에 대한 정보를 익스포
트 시키는 것이 목적이므로, 만약 이런 프로퍼티, 이벤트, 메소등을 익스포트하려면
이 타입라이브러리에서 등록시켜줘야 합니다.
왼쪽에 나오는 타입라이브러리 트리뷰에서, 다른 노드들은 건드리지 말고, 프로젝트
이름에 I~ 만 붙어 있는 이름의 노드를 선택해서 이 노드를 펼칩니다.
그러면 이미 익스포트되어 있는 속성이나 이벤트 등이 나오는데, 여기에서 마우스의
오른쪽 버튼을 눌러 나온 팝업메뉴에서 New를 선택하면 다시 서브메뉴가 나오는데,
여기에 메소드와 프로퍼티가 있습니다. (이벤트도 프로퍼티였던 걸로 기억합니다.)
여기서 가령 메소드를 추가하면, 오른쪽에 나오는 페이지컨트롤의 Attributes 탭에
IID가 자동으로 등록됩니다. 이 값은 임의로 수정할 필요는 없습니다.
여기에서 추가하는 이름은 VCL 컨트롤의 메소드 이름과 같아도 되고 달라도 됩니다.
타입라이브러리에 등록한 메소드의 이름은 (VCL컨트롤이름)+Impl이라는 다른 클래스
에 등록되므로 VCL 컨트롤 내의 메소드 이름과 반드시 같아야 할 필요는 없는거죠.
그 다음으로, ~Impl.h 파일을 보면 보통 가장 아래쪽에 기존의 디폴트 메소드들과
프로퍼티의 get~, set~ 메소드들의 선언이 있습니다. 여기에 새로운 메소드의 이름을
추가합니다. 만약 타입라이브러리 에디터에서 메소드 이름을 Method1라고 지었다면,
여기서도 똑같이 해줘야 합니다. 형식은 다음과 같습니다.
STDMETHOD(메소드이름(인자리스트));
선언은 이것이면 되었고, 당연히 이 메소드의 바디가 필요한데, 이것은 ~Impl.cpp
파일에서 추가합니다.
여기서는, 특별한 다른 추가사항이 없다면 그냥 무식하게 다음과 같이 해주면 됩니다.
STDMETHODIMP T컨트롤이름Impl::익스포트시킨메소드이름()
{
try
{
m_VclCtl->VCL컨트롤내에서의메소드이름(인자리스트);
}
catch(Exception &e)
{
return Error(e.Message.c_str(), IID_Ii2ToolBar);
}
return S_OK;
};
(대충 눈치를 채시겠지만, m_VclCtl이라는 멤버가, 원래의 VCL컨트롤의 인스턴스를
가지고 있는 포인터입니다.)
물론 실제 기능을 하는 VCL 컨트롤의 메소드는 별도로 정의해주어야 합니다. 이 정의
는 Impl클래스가 아닌 원래의 VCL 클래스내에 해주어야 하는 것은 당연하겠죠?
여기까지입니다. 빌더에서는 이렇게 해주면 정의해준 메소드가 익스포트되고, 임포트
시킨 프로젝트에서 그 메소드를 호출가능하게 됩니다. 물론 델파이에서는 조금 다른
방법으로 구현했을 겁니다. C++과 오브젝트 파스칼은, 비슷하기는 해도 분명히 다른
언어이기 때문에요.
또, 프로퍼티를 익스포트시키는 방법도 메소드를 익스포트시키는 방법과 비슷하기는
하나 조금은 다릅니다. 이것은 디폴트로 만들어진 소스를 컨닝해서 잘 살펴보면
어떻게 하는지 아실 수 있을겁니다. 저도 장님처럼 이렇게 저렇게 해보다가 알게된
것이라서 구체적으로 설명드리기는 조금 곤란하네요. 혹 또 막히시면 다시 질문을
올려주세요. 하지만 저도 해본지가 꽤 오래되어서 반드시 도움을 드릴 수 있을지는
모르겠네요.
그럼 참고하시길...
임펠리테리 박지훈이었습니다.
(
http://www.borlandforum.com, cbuilder@shinhae.com)