2014-02-20 1 views
3

기존 COM Exe Server와이를 호출하는 VBA 또는 .NET 코드가 있습니다. 시스템 관리자가 아닌 다른 사용자가 레지스트리를 사용하거나 설치할 수 있도록 레지스트리를 설치하거나 수정해야하는 경우가 필요합니다.Win7의 레지스트리가없는 COM Exe Server 사용

변경/COM Exe 서버 수정이 불가능 (비싸다) 가정 해 봅시다.

질문 1 : 내가 Registering a Running EXE Server에 undertand에 어떤에서 는, EXE 파일 서버 클래스 테이블의 CLSID를 등록를 CoRegisterClassObject를 호출 할 수 있습니다. 그렇다면 클라이언트가 CoGetClassObject를 사용할 수 있어야합니까?

질문 2 (유형/클래스에 대한 레지스트리 항목 O/짝수 승?) : 위에서 올바른 경우, 내 EXE 서버가 CComModule에는 사용 (예, 사용되지 않음) 내가 참를 CoRegisterClassObject를 호출하는 것을 볼 수 있습니다. 그 클래스 테이블을 확인하는 방법이 있나요 그렇게 볼 수 있습니까?

질문 3 :
이것은 내가 사용하고있는 코드 조각이다. clsid 및 iid는 해당 clsid 및 iid guids를 나타냅니다. 인터페이스가 등록되지 않음 (HRESULT의 예외 : 0x80040155)이 CreateInstance를 호출 할 때 실패합니다. 이것은 나에게 슬픈 일이 될 수 있습니다.

  var factory = UnsafeNativeMethods.CoGetClassObject(
      clsid, 
      RegistrationClassContext.LocalServer, 
      IntPtr.Zero, 
      typeof(UnsafeNativeMethods.IClassFactory).GUID) 
         as UnsafeNativeMethods.IClassFactory; 

      factory.CreateInstance(null, ref iid, out obj); 
+1

관리자 권한없이 클래스를 등록 하시겠습니까? 구성 요소가 등록되면 관리자가 아닌 사용자도 COM 기능을 호출하는 코드를 실행할 수 있어야합니다. –

+0

수정. 내가 뭘 하려는지 레지스트리 - 무료 활성화 (DLL 서버와 함께 할 수있는)입니다. 사용자가 많고 변경 사항이 많이 발생한다고 가정 해 보겠습니다. 그러면 등록이 필요하지 않습니다. 이 부분을 조금 더 명확하게하기 위해 첫 번째 단락을 수정했습니다. – moogs

답변

5

질문 1 : 나는 실행 EXE 서버 등록에 undertand에 어떤에서 EXE 파일 서버가 클래스 테이블의 CLSID를 등록를 CoRegisterClassObject를 호출 할 수 있습니다. 그렇다면 클라이언트가 CoGetClassObject를 사용할 수 있어야합니까? (심지어 해당/w 레지스트리 항목이 그 유형/클래스?)

예. CoRegisterClassObjectCoCreateInstanceCLSCTX_LOCAL_SERVER으로 호출하는 모든 클라이언트가 프로 시저 외 오브젝트를 사용할 수 있도록 (레지스트리없이) 충분합니다. 그러나 COM 프록시/스텁 DLL 및/또는 형식 라이브러리가 등록되어 있지 않기 때문에 호출 마샬링에 문제가있을 수 있습니다. 따라서 IDispatch, IOleCommandTarget 등의 잘 알려진 인터페이스는 문제없이 마샬링되지만 모든 사용자 정의 인터페이스는 실패합니다.

클라이언트에 EXE 서버를 제공하는 다른 방법이 있습니다. 몇 가지 예를 들면 : RegisterActiveObject, IRunningObjectTable입니다.

질문 2 : 위의가 정확하면, 내 EXE 서버 (예, 사용되지 않음) CComModule에는 를 사용하고 내가 참으로 를 CoRegisterClassObject를 호출한다 볼 수 있습니다. 이 올바르게 수행되었는지 확인하려면 클래스 테이블을 확인하는 방법이 있습니까?

나는 단지 그것을 확인하기 위해 (중 CLSCTX_LOCAL_SERVER 플래그가 필요) CoGetClassObject 또는 CoCreateInstance를 호출 생각할 수 있습니다.

질문 3 : 사용중인 스 니펫입니다. clsid 및 iid는 에 해당하는 clsid 및 iid guids를 참조하십시오. CreateInstance를 호출 할 때 이 등록되지 않은 인터페이스 (HRESULT의 예외 : 0x80040155)가 실패합니다.이것은 나에게 슬픈 일이 될 수 있습니다.

이상합니다. COM 표준 마샬 러가 인터페이스에 대한 프록시/스텁 팩터 리를 찾을 수없는 경우 0x80040155 (REGDB_E_IIDNOTREG)를 반환하지만 IClassFactory에는 사용자 지정 프록시가 필요하지 않습니다. IClassFactory의 C# 정의에 올바른 GUID이 있습니까? 그것은 Guid("00000001-0000-0000-C000-000000000046")이어야합니다.

+0

GUID가 정확합니다. CoGetClassObject 호출 자체가 좋습니다. 예외는 factory.CreateInstance 호출에서 발생합니다. 나는 당신이 언급 한 커스텀 인터페이스 문제 때문이라고 생각한다. 나는 ROT 방식을 시도 할 것이다. – moogs

+0

@moogs, hmm,'IClassFactory'는 맞춤 인터페이스가 아니며 실제 개체를 만들지 않고 그냥 공장을 검색합니다. 이 EXE 서버를 등록 할 경우 어떻게됩니까? – Noseratio

+0

맞아요. IClassFactory 자체를 검색하면 올바르게 작동합니다. 그러나 사용자 지정 인터페이스 ("iid"는 사용자 정의 인터페이스를 참조)와 함께 CreateInstance가 실패합니다. 이 코드는 EXE 서버가 등록 된 컴퓨터에서 정상적으로 작동합니다. – moogs