다음을 통해 공유


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

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

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

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

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

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

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

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

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

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

예:

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

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

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

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

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

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