다음을 통해 공유


서류 가방 조정기 작성하기

서류 가방 조정자는 Briefcase에 문서의 다양한 버전을 조정할 수 있는 수단을 제공합니다.

서류 가방 조정자 정보

서류 가방 조정자는 문서의 다양한 입력 버전을 결합하여 문서의 단일 새 출력 버전을 생성합니다. 문서 유형을 지원하기 위해 서류 가방 조정자를 만들어야 할 수도 있습니다. 이 개요에서는 브리프케이스 조정자에 대해 설명하고 이를 만드는 방법을 안내합니다.

다음 항목에 대해 설명합니다.

화해

문서는 복사 및 변경할 수 있는 정보의 컬렉션입니다. 문서의 복사본이 두 개 이상 있는 내용이 다른 경우 문서에는 다른 버전이 있습니다. 조정은 두 개 이상의 초기 버전에서 문서의 단일 버전을 생성합니다. 일반적으로 조정된 버전은 가장 최근 또는 가장 유용한 정보가 보존된 초기 버전의 정보의 조합입니다.

동일한 문서의 복사본 두 개 이상이 서로 다르다고 확인되면 브리프케이스가 조정 작업을 시작합니다. 이 컨텍스트에서 개시자 역할을 하는 서류 가방은 지정된 문서 형식과 연결된 서류 가방 조정자를 찾아서 시작합니다. 조정자는 문서를 비교하고 보존할 문서의 일부를 결정합니다. 일부 조정자는 조정을 완료하기 위해 사용자 상호 작용이 필요할 수 있습니다. 다른 사용자는 사용자 상호 작용 없이 조정을 완료할 수 있습니다. 조정자는 애플리케이션 내에 포함되거나 DLL로 구현된 확장일 수 있습니다.

일부 서류 가방 관리 담당자는 잔여물을 만들 수 있습니다. 잔여물은 일반적으로 병합된 버전에 저장되지 않은 정보를 포함하는 초기 문서와 동일한 파일 형식을 갖는 문서입니다. 잔류물은 일반적으로 작성자에게 최종 병합 버전에 없는 원본 문서의 정보를 빠르게 확인할 수 있는 방법을 제공하는 데 사용됩니다. 조정자가 잔여물을 지원하는 경우 문서의 각 원래 버전에 대해 하나의 잔여물을 만듭니다. 초기자가 요청하지 않는 한 잔류물은 만들어지지 않습니다.

일부 Briefcase 조정자는 사용자가 조정 프로세스를 종료할 수 있도록 Briefcase 소프트웨어와 함께 작동합니다. 이는 조정을 진행해서는 안 된다고 결정할 수 있는 사용자에게 중요한 기능입니다. 조정자는 일반적으로 조정에 사용자 상호 작용이 필요하고 긴 경우 종료 개체를 제공합니다. 일부 환경에서는 조정자가 부분 조정을 허용하여 사용자가 일시적으로 조정을 일시 중단하고 나중에 다시 시작할 수 있습니다. 그러나 서류 가방은 현재 부분 조정을 지원하지 않습니다.

서류 가방 조정자 만들기

조정 인터페이스를 구현하여 서류 가방 조정자를 만듭니다. 최소한 조정자는 IReconcilableObject 인터페이스 및 IPersistStorage 또는 IPersistFile 인터페이스를 구현합니다. 초기자로서 Briefcase는 조정이 필요한 시기를 결정하고 IReconcilableObject::Reconcile 메서드를 호출하여 조정을 시작합니다.

IReconcilableObject::Reconcile 광범위한 조정 기능 집합을 제공하지만 서류 가방 조정자는 대부분의 경우 최소한의 조정만 수행합니다. 특히 Briefcase는 잔여물을 생성하거나 종료 객체를 지원하기 위해 조정 기능이 필요하지 않습니다. 또한 조정자는 단일 위에서 아래로 조정을 수행하며 REC_E_NOTCOMPLETE 값을 반환해서는 안 됩니다. 즉, 부분 조정을 시도해서는 안 됩니다.

서류 가방은 IReconcileInitiator 인터페이스를 제공합니다. 서류 가방 조정자는 IReconcileInitiator::SetAbortCallback 메서드를 사용하여 종료 개체를 설정할 수 있습니다. 브리프케이스는 버전 식별자를 사용하지 않으므로, 조정자가 IReconcileInitiator에서 해당 메서드를 사용하여 이전 버전의 문서를 요청할 경우 제공할 수 없습니다.

서류 가방이 IReconcilableObject::조정할 문서 버전을 나타내는 파일 모니커 조정에 전달됩니다. 브리프케이스 조정자는 IMoniker::BindToObject 또는 IMoniker::BindToStorage 메서드를 사용하여 버전에 액세스할 수 있습니다. 후자는 일반적으로 더 빠르며 권장됩니다. 조정자는 바인딩하는 개체 또는 스토리지를 해제해야 합니다.

서류 가방 조정자가 iMoniker::BindToStorage를 사용하는 경우, 플랫 스토리지(스트림) 또는 OLE에서 정의한 구조적 스토리지에 바인딩됩니다. 조정자가 플랫 스토리지를 예상하는 경우 IMoniker::BindToStorage를 사용하여 IStream 인터페이스를 요청해야 합니다. 조정자가 구조적 스토리지를 예상하는 경우 IStorage 인터페이스를 요청해야 합니다. 두 경우 모두 스토리지에 대한 읽기 전용 직접(비트랜잭션되지 않은) 액세스를 요청해야 하며, 읽기/쓰기 액세스는 제공되지 않을 수 있습니다.

최소 서류 가방 조정자는 일반적으로 다른 버전의 스토리지를 직접 살펴보고 출력 버전에 두 버전을 포함하여 두 버전의 개체를 병합하는 등 매우 기본적인 방식으로 포함된 개체를 처리합니다.

초기자는 GetClassFile 함수에 의해 구현된 논리의 하위 집합을 사용하여 적절한 서류 가방 조정자를 찾아 지정된 파일의 형식을 확인한 다음 레지스트리에서 지정된 파일 형식과 연결된 조정자 클래스를 찾습니다. 다른 셸 구성 요소와 마찬가지로 서류 가방은 파일 이름 확장명만으로 파일 형식을 결정합니다. 파일의 확장자는 Briefcase가 파일의 조정자를 호출할 수 있도록 등록된 파일 형식을 필요로 합니다. 조정자를 설치할 때 다음 양식의 레지스트리 항목을 설정해야 합니다.

CLSID
   {the file CLSID}
      Roles
         Reconciler
            (Default) = {the reconciler-classid}

클래스는 빠른 로드여야 하고, _MULTIPLEUSE 지정해야 하며, 조정 인터페이스에 마샬러가 제공되지 않는 한 로컬 서버(.exe 파일에 구현됨)가 아닌 프로세스 내 서버(DLL에 포함)여야 합니다.

조정의 사용자 상호 작용

서류 가방 조정자는 사용자 상호 작용 없이 조정을 수행해야 합니다. 조정이 자동화될수록 프로세스에 대한 사용자의 인식이 향상됩니다.

경우에 따라 사용자 개입이 중요할 수 있습니다. 예를 들어 문서 시스템은 사용자가 병합된 버전의 문서를 수락하기 전에 변경 내용을 검토하도록 요구하거나 변경 내용을 설명하는 사용자의 의견이 필요할 수 있습니다. 이러한 경우, 서류 가방 조정자가 아닌 개시자가 사용자에게 문의하고 사용자의 지시를 수행해야 합니다.

다른 경우에는 사용자 개입이 필요할 수 있습니다(예: 호환되지 않는 방식으로 두 버전을 편집한 경우). 이러한 경우 초기자 또는 서류 가방 조정자는 사용자에게 충돌을 해결하는 방법에 대해 문의해야 합니다. 일반적으로 어떤 개시자도 일부 사용자 상호 작용을 기대하지 않고 조정을 완료하는 데 의존할 수 없습니다. 반면에 조정자는 충돌을 해결하기 위해 사용자와 상호 작용하거나 개시자가 이를 요구하도록 할 수 있습니다.

포함된 개체 조정

문서를 조정할 때 서류 가방 조정자 자체는 조정할 수 없는 형식의 포함된 개체를 검색하는 경우 초기자가 될 수 있습니다. 이 경우 조정자는 포함된 각 개체를 재귀적으로 조정하고 개시자의 모든 책임을 맡아야 합니다.

재귀를 수행하기 위해 서류 가방 조정기는 개체를 로드하고 적절한 인터페이스를 쿼리합니다. 개체에 대한 처리기는 인터페이스를 지원해야 합니다. 인터페이스의 메서드가 OLE_E_NOTRUNNING 값을 반환하는 경우 조정자는 작업을 수행하기 위해 개체를 실행해야 합니다. 포함된 개체에 대한 코드를 항상 사용할 수 있는 것은 아니므로 조정자는 이 조건에 대한 솔루션을 제공해야 합니다. 예를 들어 조정자는 조정된 버전에 포함된 개체의 이전 버전과 새 버전을 모두 포함할 수 있습니다. 조정자는 링크 간에 조정을 시도해서는 안됩니다.

초기자는 병합되는 문서 버전을 저장합니다. 대부분의 경우 초기자는 각 버전의 스토리지에 액세스할 수 있으며 비슷한 스토리지를 사용하여 조정 결과를 저장합니다. 그러나 경우에 따라 초기자에는 영구 버전을 사용할 수 없는 메모리 내 개체가 있을 수 있습니다. 이 상황은 열려 있는 포함된 개체가 포함된 문서를 저장하기 전에 조정해야 하는 경우에 발생할 수 있습니다. 이러한 경우 초기자는 메모리에 있는 버전에 조정 결과를 저장합니다.

초기자는 IPersistStorage 인터페이스를 사용하여 병합된 버전을 바인딩(로드)합니다. 초기 버전이 이미 만들어진 경우 초기자는 IPersistStorage::Load 메서드를 사용하고 초기 버전에 IPersistStorage::InitNew 메서드를 사용합니다. 병합된 버전이 로드되면 초기자는 QueryInterface 사용하여 IReconcilableObject 인터페이스의 주소를 검색합니다. 이 인터페이스는 초기자에게 기존 잔류물의 스토리지에 대한 액세스 권한을 부여하고 새 잔여물에 대한 스토리지를 만드는 방법을 제공합니다. 그런 다음 초기자가 조정을 수행하도록 인터페이스를 지시합니다. 실제로 초기자는 IPersistStorage 이전에 IPersistFile 인터페이스를 쿼리합니다. 조정자가 IPersistFile을 지원하는 경우 초기자는 IPersistStorage 메서드가 아닌 IPersistFile을 통해 복제본을 조작합니다. 이렇게 하면 복합 문서로 저장되지 않은 파일을 조정할 수 있습니다.

조정이 완료되면 초기자는 IPersistStorage 또는 IPersistFile 인터페이스를 사용하여 병합된 버전을 저장할 수 있습니다. 조정하는 동안 브리프케이스 동기화기는 필요에 따라 잔여물을 만들고 영구 비트를 스토리지에 씁니다. 병합된 버전이 스트림인 경우 IPersistStorage::Load 전달된 IStorage 인터페이스에는 스토리지 상태가 STATEBITS_FLAT 설정된 "Contents"라는 스트림이 포함됩니다. (IStorage::Stat 메서드를 사용하여 상태 비트를 설정할 수 있습니다.) 병합 후 초기자는 적절한 방식으로 데이터를 작성하여 병합된 버전을 저장합니다. STATEBITS_FLAT 스토리지에 적절하게 설정되어 있는지 확인해야 합니다.

잔류물

초기자는 IReconcilableObject::Reconcile 메서드를 호출할 때 pstgNewResidues 매개 변수를 유효한 주소로 설정하여 잔류물을 원하는지 여부를 나타냅니다. 조정자가 잔류물 생성을 지원하지 않는 경우 dwFlags 매개 변수가 RECONCILEF_NORESIDUESOK 값을 지정하지 않는 한 REC_E_NORESIDUES 값을 즉시 반환해야 합니다.

서류 가방 조정자는 새 스토리지 요소를 생성하여 pstgNewResidues가 가리키는 배열에 복사한 후, 초기자에게 잔여물을 반환합니다. 구조화된 스토리지 잔여물의 경우 조정자는 IStorage 인터페이스를 복사하고 플랫 스토리지 잔류물의 경우 STATEBITS_FLAT 플래그가 설정된 IStream 또는 IStorage 인터페이스를 복사합니다. 조정자는 IStorage를 사용하여 필요한 스토리지를 만듭니다. IStorage::CreateStream을 사용하여 스트림인 잔류물에 대한 플랫 스토리지를 만들고, IStorage::CreateStorage을 사용하여 구조적 스토리지를 생성합니다.

초기자는 pstgNewResidues 을 준비하여 그것이 IStorage 네임스페이스의 예약되지 않은 부분에 요소가 포함되지 않도록 합니다. 서류 가방 조정자는 이름이 초기 버전의 순서에 해당하는 요소에 각 잔여물을 배치합니다. 예를 들어 첫 번째 잔류물은 "1", 두 번째 잔류물은 "2" 등에 포함됩니다. 조정된 개체 자체가 잔여물을 생성하는 경우 "0"이라는 요소에 있습니다.

조정 프로그램은 새로 생성한 각 요소를 개별적으로 커밋하여 초기자가 정보를 사용할 수 있도록 합니다. 그러나 조정자는 pstgNewResidues 자체를 커밋하지 않습니다. 초기자는 이를 커밋하거나 삭제할 책임이 있습니다.

서류 가방 조정 도구 참고 자료

이 섹션에는 조정 인터페이스에 대한 정보가 포함되어 있습니다. 오류를 처리할 때 메서드는 가능한 반환 값으로 명시적으로 정의된 오류 값만 반환할 수 있습니다. 또한 메서드는 오류로 반환하기 전에 매개 변수로 전달된 주소를 가진 모든 변수를 NULL로 설정해야 합니다.

서류 가방 조정 인터페이스 및 메소드