ArcGIS Engine 개발(3)COM 기술에서의QueryInterface(인터페이스 조회)의 실현 원리와 IUnknown 인터페이스

5003 단어 ArcGISEngine
IUnknown
IUnknown 인터페이스는 어셈블리 개체 모델(COM)의 기본 인터페이스입니다.COM 규격서에는 COM 대상이 최소한 이 인터페이스를 실현해야 하며, 기타 모든 COM 인터페이스는 IUnknown 인터페이스에서 파생되어야 한다고 규정되어 있다.IUnknown은 모든 COM 객체에서 지원되는 두 가지 기본 특성을 제공합니다.
  • 인용 계수를 이용하여 대상의 생명주기 관리를 한다.(객체 라이프 사이클 제어)
  • 및 미리 정의된 많은 인터페이스에 접근합니다.(인터페이스 쿼리)
  • IUnknown 인터페이스는 가상 방법표(영어:virtual method table)를 가리키는 바늘을 포함한다. 가상 방법표는 많은 함수 바늘이 있는 목록이다. 함수 바늘은 IUnknown 인터페이스에서 선언된 많은 함수를 가리키며 인터페이스에서 선언된 순서와 같은 방식으로 배열된다.프로세스 내 호출에 따른 비용 (영어: Overhead (computing) 은 대체로 C++에서 가상 방법을 호출하는 비용과 비슷하다.

    메서드


    대상의 생존 기간은 두 가지 방법으로 제어된다AddRefRelease, 그리고 내부 인용 계수기.각 객체는 라이프 사이클을 제어하기 위해 IUnknown을 구현해야 합니다.인터페이스 포인터를 만들거나 복사할 때 AddRef 방법을 사용합니다. 클라이언트가 이 포인터를 필요로 하지 않을 때 해당하는 Release 방법을 사용합니다.참조 수가 0이 되면 객체는 자동으로 제거됩니다.클라이언트는 또한 IUnknown을 사용하여 객체의 다른 인터페이스를 가져옵니다.QueryInterface는 클라이언트가 대상의 다른 인터페이스를 필요로 할 때 호출하는 방법이다.클라이언트가 호출QueryInterface할 때 이 대상은 인터페이스를 제공하고 호출AddRef합니다.실제로 모든 COM 방법은 호출자의 증가 대상의 인용 계수를 대표하는 인터페이스를 되돌려줄 책임이 있다.이 인터페이스가 더 이상 필요하지 않을 때 클라이언트는 Release 방법을 호출해야 한다.인터페이스가 중복될 때만 클라이언트가 현저하게 호출할 수 있습니다 AddRef.IUnknown 인터페이스에는 세 가지 방법이 있습니다: QueryInterface,AddRef,andRelease:
    [ComImport(), InterfaceType(ComInterfaceType.InterfaceIsIUnknown),
    Guid("00000000-0000-0000-C000-000000000046")]
    public interface IUnknown
    {
        [PreserveSig]
        int QueryInterface(ref Guid riid, out IntPtr ppvObject);
        [PreserveSig]
        uint AddRef();
        [PreserveSig]
        uint Release();
    }
    
  • QueryInterface는 이 대상을 호출하는 프로그램으로 하여금 이 대상이 특정한 인터페이스를 지원하는지 확인할 수 있게 하고 지원하면 이 대상이 특정한 인터페이스에서 실현되는 것을 참고할 수 있다.이 방법은 C++와 유사한dynamiccast<> 또는 Java 또는 C#의 casts입니다.이 방법은 특정 인터페이스에 대응하는 전역 유일한 식별자(일반적으로 인터페이스 식별자 또는 IID, 예를 들어 AE의 GUID)를 정할 때 특정 인터페이스를 지정하는 지침을 제공할 수 있다.COM 객체가 이 인터페이스를 지원하지 않으면 ENOINTERFACE 오류입니다.
  • AddRef는 새 클라이언트 프로그램이 이 대상에 접근할 때 계수 값을 1로 더하면 업데이트된 계수 값을 되돌려줍니다.
  • Release는 클라이언트 프로그램에서 이 대상에 접근을 종료하고 계수 값을 1로 줄이면 업데이트된 계수 값을 되돌려주고 계수 값이 0이 되면 자동으로 이 COM 대상을 삭제합니다.

  • IUnknown 자체의 인터페이스 식별자는 {00000000-0000-0000-C0000-0000000046}이고 IUnknown의 세 가지 방법은 모두 순수한 가상 방법(선고할 때 =0)이기 때문에 IUnknown 클래스의 대상을 정의할 수 없습니다. 다른 클래스가 IUnknown을 계승해야 해당 클래스의 대상을 정의할 수 있습니다.

    QueryInterface


    QueryInterface 메서드는 일반적으로 이니셜 QI로 표시됩니다.
    COM 객체를 개발할 때 개발자는QueryInterface의 규칙을 준수해야 합니다.이러한 규칙은 대상의 인터페이스가 대칭적이고 전달 가능하며 반신적이며 대상의 생명 주기에 시종 사용할 수 있도록 규정한다.클라이언트의 경우, 이것은 주어진 대상의 유효한 인터페이스를 의미하며,QueryInterface에 대한 호출을 통해, 대상이 이 대상(자신을 포함)의 다른 인터페이스에 대해 항상 유효하다는 것을 묻는다.시간 또는 보안 제한으로 인해 인터페이스를 지원할 수 없으며 나중에 이 인터페이스에 접근하는 것을 거부할 수 없습니다.
    QueryInterface의 규칙은 대상의 인터페이스가 자반적이고 대칭적이며 전달할 수 있도록 규정한다.대상의 다른 인터페이스를 가져올 수 있도록 항상 유효한 인터페이스 포인터를 유지할 수 있습니다.
    특정 인터페이스를 요청할 때QueryInterface 방법은 요청한 인터페이스에 할당된 메모리 블록을 되돌려주거나 새 메모리를 할당하고 메모리를 되돌려줍니다.동일한 메모리를 반환해야 하는 유일한 시나리오는 IUnknown 인터페이스를 요청하는 것입니다.두 인터페이스 포인터를 비교해서 같은 대상을 가리키는지 확인할 때 간단한 비교를 실행하지 않는 것이 중요하다.두 인터페이스 포인터를 정확하게 비교하여 같은 대상에 속하는지 확인하려면, 두 인터페이스 포인터의 IUnknown 인터페이스를 동시에 조회하고, IUnknown 포인터에 대한 비교를 실행해야 한다.이런 방식을 통해 IUnknown 인터페이스는 COM 객체를 정의하는 표식이라고 불린다.
    IUnknown은 모든 COM 대상의 기초이기 때문에, 보통 어떤 ArcObjects 문서와 클래스에도 IUnknown에 대한 인용이 없습니다.

    AE에서 인터페이스 점프 방법

    IMap pMap;
    IActiveView pActiveView;
    pMap = axMapControl1.Map;
    ...
    pActiveView = pMap as IActiveView;// 
    // pActiveView = (IActiveView) pMap;// 
    

    중점: 인터페이스 점프 원리


    만약 위에서 QI의 개념에 대해 너무 서면으로 썼다면 우리는 실제 예로 인터페이스 조회를 설명한다.
    IPolygon pPolygon = new PolygonClass();
    double Length;
    Length = pPolygon.Length;
    IArea pArea= pPolygon as IArea;// IPolygon IArea
    double shapeArea;
    shapeArea = pArea.Area;
    

    설명하기 전에 우리는 인터페이스 자체가 하나의 규범일 뿐이고 그 실현류(이곳은PolygonClass)에 대한 속성과 방법을 호출하는 규범이라는 것을 알아야 한다.
    여기서 우리는 먼저 IPolygon pPolygon라는 인터페이스 변수를 명시했다. 인터페이스 변수는 실질적으로 어떤 메모리 주소를 저장하는 데 사용되는 변수이지만 일반적인 주소 변수와 다르다. 인터페이스 변수를 사용할 때 반드시 이 인터페이스의 규범에 부합해야 하기 때문이다.
    인터페이스 변수pPolygon는 메모리에 저장된 대상의 첫 번째 주소pPolygon가 대상PolygonClass()을 가리키는 것으로 이해할 수 있다.또한 pPolygon 변수를 사용할 때 Polygon 인터페이스의 규범에 부합해야 한다. 예를 들어 Length 속성만 있고 Area 속성이 없고 Length 속성은 읽기만 하는 것이다.pPolygonIPolygon의 첫 주소를 pArea = pPolygon as IArea;에 부여하지만 Polygon 변수의 사용은 반드시 pArea 인터페이스의 규범에 부합해야 한다.
    따라서 QI란 특정한 대상의 메모리 첫 주소를 서로 다른 인터페이스 변수에 부여하여 서로 다른 인터페이스 규범에 따라 서로 다른 속성과 방법을 접근하도록 하는 것이다.그러나 이리저리 돌아다녀도 실제로는 한 대상(pArea이나 분배된 메모리에서 인터페이스 조회를 할 수 있는지, 실제로는 두 인터페이스 바늘을 비교해서 같은 대상을 가리키는지 확인하려면 IArea 인터페이스에 빌려야 한다.
    참조: ArcObjects 문서:http://desktop.arcgis.com/en/arcobjects/latest/net/webframe.htm#4a16457c-3df5-4303-bd81-e967c9bfe4d9.htm IUnknown: https://www.beichengjiu.com/computerscience/340351.html# https://bbs.csdn.net/topics/380102611

    좋은 웹페이지 즐겨찾기