Self-Registration

구성 요소 소프트웨어가 시장으로 계속 성장함에 따라 사용자가 온라인 서비스에서 새 구성 요소를 다운로드하거나 플로피 디스크의 친구로부터 새 구성 요소를 받는 경우와 같이 단일 DLL 또는 EXE 모듈로 새 소프트웨어 구성 요소를 가져오는 인스턴스가 점점 더 많아질 것입니다. 이러한 경우 사용자가 긴 설치 절차 또는 설치 프로그램을 진행하도록 요구하는 것은 실용적이지 않습니다. IClassFactory2를 통해 처리되는 라이선스 문제 외에도 설치 절차는 일반적으로 구성 요소가 COM 및 OLE 컨텍스트에서 제대로 실행되는 데 필요한 레지스트리 항목을 만듭니다.

자체 등록은 서버 모듈이 자체 레지스트리 작업(등록 및 등록 취소)을 모듈 자체에 패키지할 수 있는 표준 수단입니다. IClassFactory2를 통해 처리되는 라이선스와 함께 사용하는 경우 서버는 외부 설치 프로그램 또는 .reg 파일이 필요 없는 완전히 자체 포함된 모듈이 될 수 있습니다.

모든 자체 등록 모듈인 DLL 또는 EXE는 먼저 여기에 표시된 대로 해당 버전 정보 리소스의 StringFileInfo 섹션에 "OleSelfRegister" 문자열을 포함해야 합니다.

VS_VERSION_INFO VERSIONINFO 
 
 ... 
 
 BEGIN 
   BLOCK "StringFileInfo" 
    BEGIN 
#ifdef UNICODE 
     BLOCK "040904B0" // Lang=US English, CharSet=Unicode 
#else 
     BLOCK "040904E4" // Lang=US English, CharSet=Windows Multilingual 
#endif 
      BEGIN 
       ... 
       VALUE "OLESelfRegister", "\0" 
      END 
 
   ... 
 
   END 
 
 ... 
 
 END 
 

이 데이터가 있으면 이 새 구성 요소를 통합하려는 애플리케이션과 같은 모든 이해 당사자가 DLL 또는 EXE를 먼저 로드하지 않고도 서버가 자체 등록을 지원하는지 여부를 결정할 수 있습니다.

서버가 DLL 모듈에 패키지된 경우 DLL은 DllRegisterServer 및 DllUnregisterServer 함수를 내보내야 합니다. 서버가 자체 등록하도록 지시하려는 애플리케이션(즉, 모든 CLSID 및 형식 라이브러리 ID)은 GetProcAddress 함수를 통해 DllRegisterServer에 대한 포인터를 가져올 수 있습니다. DllRegisterServer 내에서 DLL은 필요한 모든 레지스트리 항목을 만들어 모든 InprocServer32 또는 InprocHandler32 항목에 대한 DLL에 대한 올바른 경로를 저장합니다.

애플리케이션이 시스템에서 구성 요소를 제거하려는 경우 DllUnregisterServer를 호출하여 해당 구성 요소의 등록을 취소해야 합니다. 이 호출 내에서 서버는 이전에 DllRegisterServer에서 만든 항목을 정확히 제거합니다. 다른 소프트웨어가 TreatAs 키와 같은 추가 항목을 저장했을 수 있으므로 서버에서 해당 클래스에 대한 모든 항목을 맹목적으로 제거해서는 안 됩니다.

서버가 EXE 모듈에 패키지된 경우 서버를 등록하려는 애플리케이션은 명령줄 인수 /RegServer 또는 -RegServer (대/소문자를 구분하지 않음)로 EXE 서버를 시작합니다. 애플리케이션이 서버 등록을 취소하려는 경우 명령줄 인수 /UnregServer 또는 -UnregServer를 사용하여 EXE를 시작합니다. 자체 등록 EXE는 이러한 명령줄 인수를 검색하고 DLL이 DllRegisterServer 및 DllUnregisterServer내에서 각각 동일한 작업을 호출하여 InprocServer32 또는 InprocHandler32 대신 LocalServer32 아래에 모듈 경로를 등록합니다.

서버는 레지스트리의 해당 InprocServer32, InprocHandler32LocalServer32 키에 대한 DLL 또는 EXE 모듈의 설치 위치에 대한 전체 경로를 등록해야 합니다. 모듈 경로는 GetModuleFileName 함수를 통해 쉽게 얻을 수 있습니다.

서비스 애플리케이션으로 설치

설치 시 클래스 등록

실행 중인 EXE 서버 등록

ROT에 개체 등록