2009-12-10 2 views
3

나는 this question을 알고 있지만 거기에 나와있는 단계를 따라 왔고 여전히 난처한 상태입니다. 다음과 같이 등록COM이 내 DllSurrogate 항목을 무시하는 이유는 무엇입니까?

HKCR 
{ 
    NoRemove CLSID 
    { 
     ForceRemove {5CB1D770-BF72-4F3D-B4DA-85E0542126F4} = s 'ExamplePlugin Class' 
     { 
      val AppID = s '%APPID%' 
      InprocServer32 = s '%MODULE%' 
      { 
       val ThreadingModel = s 'Free' 
      } 
     } 
    } 
} 

내가 AppID가있어 :

HKCR 
{ 
    NoRemove AppID 
    { 
     '%APPID%' = s 'ExamplePlugin' 
     { 
      val DllSurrogate = s '' 
     } 
     'ExamplePlugin.DLL' 
     { 
      val AppID = s '%APPID%' 
     } 
    } 
} 

난 다음과 같이 등록 제가 클래스를 가지고

는, (이것은 RGS 파일입니다) CLSCTX_ALLCComPtr<IPlugin>::CoCreateInstance으로 전달하십시오.

은 즉, 지금까지 내가 말할 수있는, 내가 the checklist 따랐습니다 :

  1. 내 CLSID 아래에 지정된 AppID가 값을 가지고있다. 나는 해당 AppID 키가 있습니다.
  2. 활성화 요청에 CLSCTX_LOCAL_SERVER을 포함 시켰습니다. 내 CLSID 키에 LocalServer 키가 없습니다.
  3. 내 CLSID 키에 InprocServer32 키가 있습니다.
  4. 체크리스트에 "InprocServer32에 지정된 프록시/스텁 DLL이 있음"이라고 표시되면 "구현 DLL"을 의미합니다. 그것은 존재합니다. 내 프록시/스텁 DLL이 다른 위치에 올바르게 등록되었습니다.
  5. 내 AppID 키 아래에 DllSurrogate 값이 있습니다.

OLE/COM 개체 뷰어에서 내 클래스를 보면 구현 탭에 "대리 프로세스 사용"이 선택되어 있습니다.

여전히 작동하지 않습니다. 내 DLL이 내 호스트 EXE와 동일한 프로세스로로드되고 있습니다.

실마리 : 프로세스 모니터를 실행하면 CLSID\{...}\AppID 값을 찾을 수 없습니다. CoCreateInstance에 CLSCTX_LOCAL_SERVER을 전달하면 "class not registered"가 반환됩니다.

저는 Windows 2008 x64에 있지만 x86과 x64 용으로 컴파일 된 코드를 동일한 결과로 시도했습니다.

무엇이 누락 되었습니까?

+0

응용 프로그램이 DCOM 콘솔에 표시됩니까? – sharptooth

+0

또한 .rgs 파일을 롤인 할 때마다 대체 문자열로 매번 올바른 AppId를 전달한다는 사실을 절대적으로 확신 할 수 있습니까?그 후에 레지스트리에서 올바르게 보입니까? – sharptooth

+0

업데이트 : 명시 적으로 CLSCTX_LOCAL_SERVER를 전달하면 대리 호스트 인스턴스가 생깁니다. 왜 내가 이전에 작동시키지 못했는지 모르겠습니다. –

답변

1

문서가 오도 된 것으로 나타났습니다. CLSCTX_LOCAL_SERVER를 설정하는 것만으로는 충분하지 않습니다. 또한 CoSCreateInstance를 호출하여 CLSCTX_INPROC 값을 제거해야합니다. 그렇지 않으면 COM은 항상 in-proc 항목을 사용하고 DllSurrogate에 대해 쿼리하지 않습니다.

3

out-proc 활성화를 실행하려면 CoCreateInstance()에 CLSCTX_LOCAL_SERVER을 지정해야합니다. DCOM의 특이성 - 구성 요소가 in-proc COM 서버로 등록되어 있고 in-proc 활성화에 대한 값을 포함하여 CLSCTX_ 마스크를 지정하면 구성 요소가 in-proc로 활성화됩니다. - DCOM은 사용되지 않습니다.

COM +는 거의 동일한 기능을 제공하지만 "서버 응용 프로그램"을 만들고 거기에 구성 요소를 추가 한 다음 CLSCTX_ALL을 지정하면 구성 요소가 COM +에서 인스턴스화되고 surrogate-out-proc 활성화가 자동으로 선택됩니다.

+0

CLSCTX_LOCAL_SERVER를 지정하지 않아도되므로 inproc 플래그를 명시 적으로 * 지정하지 않아도됩니다. –

+0

... COM + 서버 응용 프로그램은 어떻게 만듭니 까? 추가 정보 : 설치 프로그램에서 어떻게합니까? –

+0

Yeap, 알겠습니다. 실제로 나는 그것을 정확하게 의미했다. – sharptooth

관련 문제