ArcGIS Engine 개발(3)COM 기술에서의QueryInterface(인터페이스 조회)의 실현 원리와 IUnknown 인터페이스
IUnknown 인터페이스는 어셈블리 개체 모델(COM)의 기본 인터페이스입니다.COM 규격서에는 COM 대상이 최소한 이 인터페이스를 실현해야 하며, 기타 모든 COM 인터페이스는 IUnknown 인터페이스에서 파생되어야 한다고 규정되어 있다.IUnknown은 모든 COM 객체에서 지원되는 두 가지 기본 특성을 제공합니다.
메서드
대상의 생존 기간은 두 가지 방법으로 제어된다AddRef
와Release
, 그리고 내부 인용 계수기.각 객체는 라이프 사이클을 제어하기 위해 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();
}
[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 속성은 읽기만 하는 것이다.pPolygon
는 IPolygon
의 첫 주소를 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
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
esri SmartMapping 정보
Data를 사용하기 쉽고 멋지게 Visualize하면 공유한다.
ArcGIS online의 Light version 같지만, Styling도 현명하게 선택된다.
오늘까지의 가장 사용하기 쉽고 서비스의 cartoDB에...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.
IMap pMap;
IActiveView pActiveView;
pMap = axMapControl1.Map;
...
pActiveView = pMap as IActiveView;//
// pActiveView = (IActiveView) pMap;//
IPolygon pPolygon = new PolygonClass();
double Length;
Length = pPolygon.Length;
IArea pArea= pPolygon as IArea;// IPolygon IArea
double shapeArea;
shapeArea = pArea.Area;
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
esri SmartMapping 정보Data를 사용하기 쉽고 멋지게 Visualize하면 공유한다. ArcGIS online의 Light version 같지만, Styling도 현명하게 선택된다. 오늘까지의 가장 사용하기 쉽고 서비스의 cartoDB에...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.