Была подобная тема, но она закрыта
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 =
HKEY_CLASSES_ROOT\Company.IKServer\OPC\Vendor = Company
HKEY_CLASSES_ROOT\Company.IKServer.1 = IKServer
HKEY_CLASSES_ROOT\Company.IKServer.1\CLSID =
HKEY_CLASSES_ROOT\CLSID\ = IKServer
HKEY_CLASSES_ROOT\CLSID\\AppID =
HKEY_CLASSES_ROOT\CLSID\\Implemented Categories\
HKEY_CLASSES_ROOT\CLSID\\Implemented Categories\
HKEY_CLASSES_ROOT\CLSID\\Implemented Categories\
HKEY_CLASSES_ROOT\CLSID\\LocalServer32 = 'C:\<путь до .ехе>'
HKEY_CLASSES_ROOT\CLSID\\ThreadingModel = 'both'
HKEY_CLASSES_ROOT\CLSID\\ProgID = 'Company.IKServer.1'
HKEY_CLASSES_ROOT\CLSID\\VersionIndependentProgID = 'Company.IKServer'
HKEY_CLASSES_ROOT\AppID\ = 'IKService'
HKEY_CLASSES_ROOT\AppID\\LocalService = service_name
В результате, при попытке обратится к сервису из клиентской программы или OLEView сервис успешно стартует, если не был запущен. Но при этом выскакивает окошко:
CoGetClassObject failed.
E_ACCESSDENIED ($80070005).
Как правильно зарегестрировать фабрику классов ?
Заранее спасибо за ответ.