안녕하세요..
저는 ArcGis라는 Gis용 툴을 사용하고 있는 개발자(?)입니다..
ArcGis라는 놈이 Com으로 만들어 져 있다고 얘기를 듣고 VB를 사용하여
프로젝트를 하나 수행하였습니다.
VB를 사용하면 Com에 대한 이해가 별로 없어도 잘 사용할 수 있습니다.
근데 저는 프로젝트가 끝난후 이것을 Delphi로 한번 구현해보고자 하였습니다.
Delphi로 구현하고자 하니 Com에 대한 이해가 없이는 안되겠더라구요..
그래서 열심히 문서 읽었습니다.. 하지만 소스가 거의 C++로 되어있는 관계로 개론부분만 충실히 읽고 말았죠..
ArcGis에서 제공하는 Object Model Diagram을 보면
Application이라는 클래스(아마 coClass같습니다.)에는
IApplication이라는 인터페이스가 있고 이 IApplication이라는 인터페이스는 IDispatch인터페이스를 상속받고 있습니다.
제가 묻고자 하는 부분은
var
m_pApp : IApplication;
function TMyButt.OnCreate(const hook: IDispatch): HResult;
begin
m_pApp := hook as iApplication;
end;
이 부분입니다.
이 코드가 하는일은 ArcGis라는 프로그램을 실행하고 이 프로그램의 포인터를 받아와서 m_pApp라는 변수에 넣는 겄입니다. 즉 m_pApp로 arcGis를 제어하겠다는 얘기 인데.
as라는 것을 몰라서(여기서 사용되는지 몰라서..^-^;;)
m_pApp := hook라고 쓰니 IDispatch와 IApplication은 Casting이 안된다는 에러 메시지를 받고 한창 좌절했습니다.
제가 아는바로는 IDispatch는 특정메소드를 사용할수 있게 해주고 IDispatch는 IUnknown인터페이스를 상속받고(모든 인터페이스는 IUnknown을 상속받는걸로 알고 있습니다.)IUnknown인터페이스는 QueryInterface를 통해서 특정 클래스에 있는 다른 인터페이스의 포인터를 얻어올수 있다고요..
어떤 소스를 보니 QueryInterface라는 것을 직접써서 하는게 있더라구요..
m_pApp.QueryInterface(IID_IObjectFactory, pObjFactory);
위에것을 이해하지 못하고 있는데..
여기서 제가 묻고자 하는것은
function TMyButt.OnCreate(const hook: IDispatch): HResult;
begin
m_pApp := hook as iApplication;
end;
이부분에서 QueryInterface라는 것을 써서 as말구요..
어떻게 하면 되는지 좀 갈켜 주십시오..
제 질문에서 부족하고 빠진게 있으면 어떤건지 말씀해주시면 다시 글올리겠습니다.
제컴은 Win2000이고 delphi5에서 사용하고 있습니다.
그럼 좀 상세한 답변좀 부탁드립니다.