본문 바로가기
프로그래밍/PC

Interface 요약 #4

by 사악신 2012. 4. 19.

지금으로부터 무려 10년전인 2002년 5월경, 델마당 개인게시판에 올렸던 총 9회의 글입니다. 유실된 줄 알았는데 싸이월드 게시판에 있는 걸 확인하고 복구합니다.;;

 

 

7. Interface의 포인터 획득하기

var
  MyInteger: TFormattedInteger;
  MyNumber: IFormattedNumber;
begin
  MyInteger:= TFormattedInteger.Create(12);
  MyNumber:= MyInteger;
end;
  • 컴파일시 정적으로 할당됨(만약, 객체가 해당 인터페이스를 지원하지 않으면 컴파일시 에러발생)
var
  MyObject: TObject;
  MyNumber: IFormattedNumber;
begin
  MyObject:= TFormattedInteger.Create(12);
  // ...(중략)...
  if MyObject.GetInterface(IFormattedNumber, MyNumber) then
  ShowMessage(MyNumber.FormattedString);
end;
  • GetInterface를 사용, 동적으로 인터페이스를 지원하는지 여부를 확인한 후 할당함.

 

function TObject.GetInterface(const IID: TGUID; out Obj): Boolean;

 

  • IID: 포인터를 얻기 위한 인터페이스의 GUID
  • 지원 여부 결과를 참, 거짓으로 반환함
  • 참이면 Obj 파라미터로 인터페이스의 포인터를 돌려줌
var
  MyObject: TObject;
  MyNumber: IFormattedNumber;
begin
  MyObject:= TFormattedInteger.Create(12);
  //...(중략)...
  MyNumber:= MyObject as IFormattedNumber;
  ShowMessage(MyNumber.FormattedString);
end;
  • 해당 객체가 인터페이스를 지원하지 않으면 참, 거짓 대신 예외를 발생시킨다.
procedure DoSomethingWithObject(O: TObject);
var
  MyNumber: IFormattedNumber;
begin
  if O.GetInterface(IFormattedNumber, MyNumber) then
  ShowMessage(MyNumber.FormattedString);
end;

procedure DoSomethingWithInterface(I: IUnknown);
var
  MyNumber: IFormattedNumber;
begin
  ShowMessage((I as IFormattedNumber).FormattedString);
end;
  • GetInterface는 TObject의 메쏘드(멤버함수)이기 때문에 객체 이외의 순수한 인터페이스에는 사용할 수 없다. 반면 as 연산자는 객체와 IUnknown 만을 상속받은 인터페이스에 모두 사용할 수 있다.
  • GetInterface와 as는 인터페이스에 GUID가 있는 경우에만 사용할 수 있다
  • 만약 GUID가 없는 Interface를 GetInterface 로 사용한 경우, Operator not applicable to this operand type 에러를 발생한다.
  • 만약 GUID가 없는 Interface를 as 로 사용한 경우, Interface 'IFormattedNumber' has no interface identification 에러를 발생한다.
 

 

 

 

반응형

'프로그래밍 > PC' 카테고리의 다른 글

Interface 요약 #6  (0) 2012.04.19
Interface 요약 #5  (0) 2012.04.19
Interface 요약 #3  (0) 2012.04.19
Interface 요약 #2  (0) 2012.04.19
Interface 요약 #1  (0) 2012.04.19

댓글