다음을 통해 공유


확장에서 자동화에서 함수/속성 이름 충돌 해결

이 항목에서 "개체"는 ADSI 클라이언트가 보는 개체를 전체적으로 나타냅니다. 즉, ADSI 및 모든 확장입니다.

동일한 매개 변수를 가진 동일한 함수 이름

개체의 두 개 이상의 이중 IDispatch 인터페이스가 같은 이름의 속성 또는 메서드(예: Func1 )를 지원하는 경우 호출은 다음 조건을 사용하여 결정됩니다. 클라이언트에 Func1 메서드를 지원하는 이중 인터페이스 중 하나에 대한 포인터가 있고 Automation 환경에서 vtable 액세스를 지원하는 경우 Func1 ADSI vtable 액세스를 통해 직접 호출됩니다.

위의 조건 중 하나가 false이면 IDispatch::GetIDsOfNamesIDispatch::Invoke 호출하여 Func1호출합니다.

클라이언트가 이중 인터페이스에 대한 포인터를 추가하는 방법에 대한 자세한 내용과 간략한 설명 및 vtable 액세스를 지원하는 환경 유형에 대한 설명은 ADSI 확장 모델 지연 바인딩 및 Vtable Access를 참조하세요.

모든 확장 개체는 IDispatch 함수를 다시 집계로 리디렉션하기 때문에 aggregator는 Func1 제어합니다. 규칙은 다음과 같습니다.

  • 인터페이스가 있는 경우 ADSI(집계기)에서 Func1함수를 지원하는 경우 집계자는 고유한 Func1호출합니다.
  • 그렇지 않으면 집계기는 레지스트리에 나열된 순서대로 각 확장을 거치고 Func1함수를 구현하는 첫 번째 확장을 찾습니다. 이 첫 번째 확장의 여러 이중 IDispatch 인터페이스에는 Func1함수가 있을 가능성은 낮습니다. 확장은 Automation에서 항상 호출해야 하는 Func1 결정해야 합니다.

다른 매개 변수를 가진 동일한 함수 이름

이전 섹션에서는 함수 이름 충돌( 즉, Automation에서 발생할 때 함수 이름과 숫자, 형식 및 순서와 같은 매개 변수 목록이 동일한 함수 이름)을 해결하는 방법을 설명했습니다. 두 함수의 이름이 같지만 매개 변수가 다르면 어떻게 될까요? ADSI 클라이언트가 여러 이름을 사용하여 매개 변수를 지정하지 않고 IDispatch::GetIDsOfNames 사용하여 함수를 호출하는 경우 ADSI 확장 모델은 함수를 구분할 수 없습니다. 위에서 설명한 해결 체계에 따라 해당 인터페이스 중 하나를 통해 이 함수를 지원하는 레지스트리의 첫 번째 확장에는 이 함수의 버전이 호출되며 호출이 실패하거나 잘못된 결과를 생성할 수 있습니다.

예를 들어:

  • Extn1(클래스 CA의 레지스트리에서 첫 번째 - 높은 우선 순위)은 IInterface1지원합니다.
  • Extn2(클래스 CA에서 레지스트리에서 세 번째 - 낮은 우선 순위)는 IInterface2지원합니다.
  • IInterface1Method1(int param1, int param2)지원합니다.
  • IInterface2Method1(int param1)지원합니다.

ADSI 클라이언트에는 클래스 CA 개체에 대한 IDispatch 인터페이스 포인터가 있습니다. IInterface2::Method1 호출하려고 합니다. 클라이언트가 "pDispatch->GetIDsOfNames(IID_NULL, rgszNames, 1, MY_LCID, rgDispId)"는 함수 이름 "Method1"을 rgszNames[0]저장한 다음, 원하는 IInterface2::Method1 호출되는 대신 IInterface1::Method1 매개 변수 수가 다르므로 함수가 실패합니다.

이 문제를 최소화하기 위해 확장 개발자는 고유한 특정 식별자를 사용하여 함수 이름을 접두사로 지정하고 이름이 같지만 매개 변수가 다른 함수를 사용하는 인터페이스 디자인을 방지할 수 있습니다.

이름 충돌이 발생하는 경우 인터페이스가 이중 인터페이스인 경우 ADSI 클라이언트는 직접 vtable 액세스로 문제를 방지할 수 있습니다. 직접 vtable 액세스가 불가능한 경우 ADSI 클라이언트는 앞에서 설명한 rgszNames 배열의 매개 변수뿐만 아니라 함수 이름도 지정하여 여러 이름으로 IDispatch::GetIDsOfNames 호출해야 합니다.

Visual Basic 5는 여러 이름의 IDispatch::GetIDsOfNames 함수를 호출하지 않습니다. 즉, 함수 이름만 getIDsOfNames 전달하지만 인수는 전달하지 않습니다. 그러나 Visual Basic 5를 사용하면 인터페이스가 이중 인터페이스인 경우 IDispatch::GetIDsOfNames 함수를 호출하는 대신 직접 vtable 액세스로 함수를 호출할 수 있습니다. 개발자는 가능한 경우 직접 vtable 액세스를 사용해야 합니다.

이름 충돌 해결에 대한 자세한 내용은 함수 이름 충돌 해결 예제참조하세요.