ATL을 사용하여 경량급 COM 객체 만들기(7)

3241 단어 직장레저
ATL 및 레지스트리
CComModule는 두 가지 방법을 제공합니다. 하나는 Register 서버이고, 다른 하나는 Unregister 서버입니다.이 두 가지 방법은 Init 루틴에 전달되는 객체 매핑을 사용하여 실제 작업을 수행합니다.앞에서 언급한 바와 같이 모든 대상 맵 입구에는 pfn Update Registry 함수 바늘이 포함되어 있으며, 이 바늘은 클래스 실현자가 제공해야 합니다.ATL 최초 릴리즈에서 제공하는 절차는 CLSID에 표준 등록 포털을 자동으로 추가하여 기본 동작을 쉽게 구현하는 것입니다.안타깝게도 이러한 절차는 확장성이 높지 않고, 서버의 수요가 정상적인 InprocServer32 입구에 포함된 내용을 초과하면, 반드시 수동으로 등록 코드를 작성해야 한다.구성 요소 종류(categories)와 AppIDs 개념이 등장함에 따라 ATL1을 인정할 수 있는 서버가 거의 없다.0에서 제공하는 표준 등록 포털입니다.ATL1.1 및 이후 버전에서 가장 선호하는 자가등록 기술은 등록 스크립트를 사용하는 것으로 매우 유연하다.이 기술은 IRegistrar 인터페이스의COM을 필요로 합니다. 정적 링크를 통해 의존성을 낮출 수도 있고, CoCreate Instance 동적 연결을 통해 코드 크기를 최소화할 수도 있습니다.등록 스크립트는 지정된 CLSID에 추가해야 할 엔트리를 나열하는 텍스트 파일입니다.등록 스크립트 파일의 기본 확장자는 RGS이며 사용자 정의 REGISTRY 유형 리소스로 실행 파일에 추가됩니다.등록 스크립트의 구문은 다음과 같이 간단합니다.

 [NoRemove|ForceRemove|val] Name [ = s|d ''''Value''''] 
 {
   ...  
 }
     

NoRemove 접두사는 로그아웃할 때 이 키를 삭제하지 않음을 나타냅니다.ForceRemove 접두사는 이 키를 쓰기 전에 현재 키와 하위 키를 삭제합니다.Val 접두사는 이 입구가 키가 아닌 이름의 값임을 나타냅니다.s 및 d 값 접두어는 각각 REG 를 나타냅니다.SZ 또는 REGDWORD.ATL의 해석 메커니즘은 HKEY 를 식별할 수 있다CLASSES_ROOT 등 표준적인 등록표 키도 HKCR 같은 줄임말 표현을 식별할 수 있다.다음은 스크립트 등록의 예: REGEDIT4

 REGEDIT4
 [HKEY_CLASSES_ROOT\CLSID\{XXX}]
 @=My Class
 [HKEY_CLASSES_ROOT\CLSID\{XXX}\InprocServer32]
 @=C:\foo\bar.dll
 ThreadingModel=Free

해당 등록 스크립트는 다음과 같습니다.

 HKCR {
   NoRemove CLSID {
     ForceRemove {XXX} = s ''''My Class'''' {
       InprocServer32 = s ''''%MODULE%'''' {
         val ThreadingModel = s ''''Free''''
       }
     }
   }
 }  

자원 스크립트를 사용할 때, 당신의 클래스 Update Registry 방법은DECLARE 를 쉽게 통과할 수 있습니다REGISTRY_RESOURCEID 매크로 정의는 리소스 ID(일반적으로 resource.h에서 정의)를 매개변수로 사용합니다.

class CPager : public 
 CComObjectRoot,public   
 IPager
   CComCoClass {
   DECLARE_REGISTRY_RESOURCEID(IDR_PAGER)
 };
 

이 매크로는 Update Registry 방법만 정의하고 CCom Module에 내장된 방법인 Update Registry From Resource를 호출합니다.이 방법은 자원 스크립트를 호출하는 해석 메커니즘이 있다.위에 표시된 등록 스크립트에서%MODULE%는 실제 GetModuleFileName 호출 결과로 대체됩니다.만약 동적 실행 값에 따라 추가 등록 항목을 추가해야 한다면,% MODULE% 를 사용하지 않고, 등록하기 전에 바꿀 수 있는 다른 열을 추가할 수 있습니다.이를 위해서는 먼저 새로운 변환 변수를 선택하고 백분율 기호로 변수 이름을 한정해야 한다.예를 들면 다음과 같습니다.

 DateInstalled = s ''''%CURRENTDATE%'''' 

그리고 DECLARE 대신 맞춤형 Update Registry 방법을 정합니다.REGISTRY_ RESOURCEID 매크로, 당신의 방법에서 모듈에 등록된 엔진에 이름-값 대조표를 만듭니다.다음은%CURRENTDATE% 변수를 현재 날짜를 포함하는 열로 대체하는 예입니다.

static HRESULT WINAPI 
 CPager::UpdateRegistry(BOOL b) {
   OLECHAR wsz [1024]; SYSTEMTIME st;  
   GetLocalTime(&st);
   wsprintfW(wsz, L"%d/%d/%d", st.wMonth, st.wDay, 
             st.wYear);
   _ATL_REGMAP_ENTRY rm[] = {
     { OLESTR("CURRENTDATE"), wsz}, { 0, 0 }, 
   };
   return _Module.UpdateRegistryFromResource(IDR_PAGER,b, rm);
 }

이 코드와 등록 스크립트의 마지막 실행 결과는 등록 키DateInstalled가 설치 날짜를 포함합니다

좋은 웹페이지 즐겨찾기