2009-11-10 6 views
3

기존의 네이티브 C++ ATL in-proc COM 서버를 별도의 프로세스로 강제 실행하려고합니다. DCOM이 COM 서버를 변경하지 않고도이 작업을 수행 할 수 있기를 바랍니다.DLL을 별도의 프로세스로로드하려면 DCOM을 정확히 어떻게 설정해야합니까?

저는 일반적인 레지스트리 설정으로 시작했습니다. HKCR \ CLSID {classId} 항목과 .dll 파일 경로를 지정하는 InProcServer32 키가 있습니다.

응용 프로그램 ID (GUID)를 생성하여 여기 저기에 추가했습니다. 특히 HKCR \ CLSID {classId} 아래에 응용 프로그램 ID와 동일한 문자열 값 "AppId"를 추가했습니다. HKCR \ AppId {applicationId} 키와 문자열 값 "DllSurrogate"를 빈 문자열과 동일하게 추가했습니다. 내 COM 서버를 기본 시스템 제공 대리자로 강제하는 것만으로도 충분하다고 생각했습니다.

DCOM 응용 프로그램이 DCOM 구성 콘솔에 나타납니다. 그러나 CoCreateInstance() 또는 CoGetClassObject()을 호출하고 클래스 ID와 CLSCTX_LOCAL_SERVER을 제공하면 "클래스가 등록되지 않았습니다."가 반환됩니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

UPD : 해결되었습니다. 어떤 단계에서 InProcServer32 키 아래에서 동일한 경로를 사용하는 잘못된 클래스 ID에 대한 레지스트리를 편집한다는 점을 제외하고는 조치를 취하기에 충분했습니다. 아마도 COM 지옥 문제 였을 것입니다.

+0

프로세스 모니터를 실행하고 CoCreateInstance의 레지스트리 요청을 따르십시오. x64 OS에서 실행중인 경우 일부 x64-x86 문제 일 수 있습니다. –

답변

2

Follow the check list :

  1. 레지스트리에서 CLSID 키 아래에 지정된 AppID가 값 및 해당 AppID가 키가 있어야합니다. ()
  2. 활성화 호출에서 CLSCTX_LOCAL_SERVER 비트가 설정되고 CLSID 키가 LocalServer32, LocalServer 또는 LocalService를 지정하지 않습니다. ()
  3. CLSID 키에 InprocServer32 하위 키가 있습니다. ()
  4. InprocServer32 키에 지정된 프록시/스텁 DLL이 있습니다. ???
  5. DllSurrogate 값은 AppID 키 아래에 있습니다. ()
+0

Emmm ... 내 COM 서버 DLL을 제외하고 어떤 프록시/스텁 DLL이 의미가 있습니까? – sharptooth

+0

나도 알아, 이상한, 나는 또한 내 레지스트리를 검색하고 DllSurrogate * 프록시 * 스텁 항목을 찾을 수 없습니다. –

+0

아마도 프록시/스텁 코드가 COM 서버 DLL에 연결되어야한다는 의미일까요? – sharptooth

2

잘못된 레지스트리 키입니다. HKCR \ CLSID {classId}에 InProcServer32가 아닌 LocalServer32를 설정해야합니다.

그러나 창은 DLL을 인스턴스화 할 수 없습니다. 따라서 프로그램을 전체 COM 서버 exe로 변경해야합니다. Windows에서 EXE를 시작하고 인수/포함을 보냅니다. 그런 다음 CComModule을 만들고 프로그램을 시작할 수 있습니다.

+0

여기에 : http://msdn.microsoft.com/en-us/library/ms686606(VS.85).aspx 그들은 InProcServer32가되어야하고 대리모로 강제로 LocalServer32가 아니라고 주장합니다. 결국 내 .exe가있는 경우 대리인을 물어 보는 이유는 무엇입니까? – sharptooth

+0

어, 그게 이상합니다. 이 기사에서는 CLSCTX_LOCAL_SERVER를 지정해야하지만 명시 적으로 LocalServer32 레지스트리 키가 없어야한다고 말합니다. 나는 뒤죽박죽입니다. ( –

+0

설명이 정확합니다 .LocalServer32가 지정되면 해당 키 아래의 .exe가 사용됩니다. surrogate. – sharptooth

0

이 DLLHOST.EXE는 만들어진 것이 아닙니까?

+0

예, DCOM을 대리로 사용할 것을 기대합니다. 그러나 분명히 그것은 원하지 않습니다. – sharptooth

관련 문제