2013-03-30 4 views
0

COM 서버 (ATL로 구현 된 COM 클래스)를 가진 exe 코드가 있습니다. 모든 인터페이스가 정의 된 .idl 파일이 있습니다. 이제 COM 서버를 등록한 후 레지스트리 항목을 살펴보고 다음을 찾을 수있었습니다. 각 인터페이스에는 해당 IID와 ProxyStubClsid32가있는 항목이 있습니다. 내가 언급 한 COM 서버에 의해 구현되는 하나의 인터페이스가 있습니다.이 인터페이스는 키 필드에 IID = ProxyStubClsid32 값을 가지며 모든 다른 인터페이스 인터페이스 항목은 ProxyStubClsid32 필드에 동일한 IID 항목을 가지고 있습니다. 왜 이것이 뭡니까?out-of-proc COM 서버에 새로운 인터페이스와 구성 요소를 추가 한 후의 레지스트리 키 변경

다음으로이 인터페이스를 exe에 구현하는 새로운 인터페이스와 새 COM 구성 요소를 추가하려고 할 때 레지스트리에서 관찰 할 수있는 등록 정보는 이제이 새 인터페이스와 해당 ProxyStubClsid32의 IID 항목이 동일하다는 것입니다. 새로 추가 된 IID는 이제 다른 모든 인터페이스의 ProxyStubClsid32에 있습니다.

ProxyStubClsid32에 들어가는 내용은 어떻게 결정됩니까?

새 인터페이스를 추가 한 후에도 이전 IID가 ProxyStubClsid32에 있어야합니다. 내가 어떻게 할 수 있을까 ??

또한이 구성 요소를로드하는 셸 확장을 구현할 때 explorer.exe가이 레지스트리 항목을 캐시합니다. 이전 항목을 참조하고 있으므로 해당 exe에서 새 인터페이스를 쿼리하지 않습니다. explorer.exe를 다시 시작하면 모든 것이 정상적으로 작동합니다.

아무도 이것에 대해 의견을 말할 수 있습니까? 사전에 Registry keys for out-of-process COM server

감사 : 이것에 대답 보인다

내 문제에 대한 몇 가지 힌트가 있습니다.

+0

설명하는 모든 것이 완전히 정상입니다. MIDL은 IDL 파일의 첫 번째 인터페이스의 IID를 프록시/스텁의 CLSID로 선택합니다. 그래서 새로운 인터페이스를 상단에 추가했을 것입니다. 문제는 아니지만 분명히 제대로 다시 등록되었습니다. 탐색기를 다시 시작하는 것이 정상입니다. –

+0

MIDL에 추가 된 새 IID를 선택하여 처음에 IID를 선택하여 explorer.exe를 다시 시작하지 않아도되는 방식으로 MIDL에 저항 할 수있는 방법이 있습니까 ?? –

+0

나는 이미 언급했다. 새 인터페이스를 맨 위에 놓지 마십시오. –

답변

0

실제로 ProxyStubClsid32에있는 것은 실제로 MIDL에 의해 마샬링에 사용되는 인터페이스입니다. 이것은 인터페이스가 IDispatch로부터 상속 받았기 때문에 컴파일러가 마샬링 (OOP 서버로서 마샬링이 필요함)을 처리하기 때문에 필요합니다.

우리 팀의 경우 일부 컴퓨터 (/ RegServer는 충분하지 않음)에 서버를 등록하는 데 문제가 있었지만이 코드로 작은 exe를 사용하여 모든 등록 문제가 해결되었습니다 (따라서 E_NOINTERFACE 문제가있을 수 있음) 모든 빌드 또는 설치 후 호출하십시오.

// Register the server 
      String^ l_TLB = l_Path + "\\MyServer.tlb"; 
      IntPtr l_TLBP = System::Runtime::InteropServices::Marshal::StringToBSTR(l_TLB); 
      ITypeLib *pTypeLib; 
      HRESULT hr; 
      hr = LoadTypeLibEx(static_cast<LPCOLESTR>(l_TLBP.ToPointer()), REGKIND_REGISTER, &pTypeLib); 
      if(SUCCEEDED(hr)) 
       pTypeLib->Release();