Конференция "Corba" » CoRegisterClassObject в сервисе выдает E_ACCESSDENIED у клиента [С++, Windows]
 
  • МистерТ (03.03.08 13:42) [0]
    Была подобная тема, но она закрыта
    http://pda.delphimaster.net/?id=1177523055&n=8

    А у меня вопрос в следующем:
    Имеется рабочий интерактивный сервис, обменивающийся данными с внешними устройствами и отображающий эти данные. Необходимо передать это все куда-то дальше используя COM (в частности OPC но это не суть важно).
    В конструкторе класса фабрики вызываю:
       CoInitializeEx(NULL, COINIT_MULTITHREADED);
    ...
       hResult = CoRegisterClassObject(IID_IIKServer,
                                       static_cast <IUnknown*> (this),
                                       CLSCTX_LOCAL_SERVER,
                                       REGCLS_MULTIPLEUSE,
                                      &m_dwServer);


    hResult = S_OK
    IID - это мне так удобнее, заместо CLSID.
    Для тестирования использую клиентское приложение (не мое) и утилиту OLEView из поставки MSVS.
    Вся регистрация и прочее ведется вручную и в реестре прописываю следующее:
    HKEY_CLASSES_ROOT\Company.IKServer = IKServer
    HKEY_CLASSES_ROOT\Company.IKServer\CLSID = {F7DF85A6-8C42-4b0b-80EF-54C7300F9DFB}
    HKEY_CLASSES_ROOT\Company.IKServer\OPC\Vendor = Company
    HKEY_CLASSES_ROOT\Company.IKServer.1 = IKServer
    HKEY_CLASSES_ROOT\Company.IKServer.1\CLSID = {F7DF85A6-8C42-4b0b-80EF-54C7300F9DFB}
    HKEY_CLASSES_ROOT\CLSID\{F7DF85A6-8C42-4b0b-80EF-54C7300F9DFB} = IKServer
    HKEY_CLASSES_ROOT\CLSID\{F7DF85A6-8C42-4b0b-80EF-54C7300F9DFB}\AppID = {F7DF85A6-8C42-4b0b-80EF-54C7300F9DFB}
    HKEY_CLASSES_ROOT\CLSID\{F7DF85A6-8C42-4b0b-80EF-54C7300F9DFB}\Implemented Categories\{63D5F430-CFE4-11D1-B2C8-0060083BA1FB}
    HKEY_CLASSES_ROOT\CLSID\{F7DF85A6-8C42-4b0b-80EF-54C7300F9DFB}\Implemented Categories\{63D5F432-CFE4-11D1-B2C8-0060083BA1FB}
    HKEY_CLASSES_ROOT\CLSID\{F7DF85A6-8C42-4b0b-80EF-54C7300F9DFB}\Implemented Categories\{CC603642-66D7-48F1-B69A-B625E73652D7}
    HKEY_CLASSES_ROOT\CLSID\{F7DF85A6-8C42-4b0b-80EF-54C7300F9DFB}\LocalServer32 = 'C:\<путь до .ехе>'
    HKEY_CLASSES_ROOT\CLSID\{F7DF85A6-8C42-4b0b-80EF-54C7300F9DFB}\ThreadingModel = 'both'
    HKEY_CLASSES_ROOT\CLSID\{F7DF85A6-8C42-4b0b-80EF-54C7300F9DFB}\ProgID = 'Company.IKServer.1'
    HKEY_CLASSES_ROOT\CLSID\{F7DF85A6-8C42-4b0b-80EF-54C7300F9DFB}\VersionIndependentProgID = 'Company.IKServer'
    HKEY_CLASSES_ROOT\AppID\{F7DF85A6-8C42-4b0b-80EF-54C7300F9DFB} = 'IKService'
    HKEY_CLASSES_ROOT\AppID\{F7DF85A6-8C42-4b0b-80EF-54C7300F9DFB}\LocalService = service_name


    В результате, при попытке обратится к сервису из клиентской программы или OLEView сервис успешно стартует, если не был запущен. Но при этом выскакивает окошко:
    CoGetClassObject failed.
    E_ACCESSDENIED ($80070005).
    Как правильно зарегестрировать фабрику классов ?
    Заранее спасибо за ответ.
  • МистерТ (03.03.08 14:43) [1]
    Если кто столкнется с подобной проблемой - CoInitializeSecurity() с нулевыми параметрами после вызова CoInitializeEx и перед CoRegisterClassObject решает проблему (хотя не уверен на счет порядка, но менять не буду ибо работает и авредить самому себе в планы не входит).
 
Конференция "Corba" » CoRegisterClassObject в сервисе выдает E_ACCESSDENIED у клиента [С++, Windows]
Есть новые Нет новых   [120349   +19][b:0][p:0.002]