Delphi Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
델파이 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
FreePascal/Lazarus
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
델마당
볼랜드포럼 광고 모집

델파이 Q&A
Delphi Programming Q&A
[6863] [답변] DASHFORM/ ActiveX Control관한 질문...
박지훈.임프 [cbuilder] 624 읽음    1999-12-06 15:11
안녕하세요. 천리안 프로그래머 포럼 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)



+ -

관련 글 리스트
6863 [답변] DASHFORM/ ActiveX Control관한 질문... 박지훈.임프 624 1999/12/06
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.