Я в процессе добавления нового объекта на мой существующий COM-сервер. Я не делал этого в последнее время (то есть за последние 4 года). Я не использовал Волшебника, чтобы добавить новый объект, но я не сделал это приблизительно через десятилетие. Обычно я просто использую копии файлов предыдущего объекта и делаю необходимые изменения. Теперь я застрял в своем новом классе, не будучи зарегистрированным. Конечно, я уже создал интерфейсы и внедрил методы, но обнаружил проблему с реестром, только когда моему клиенту не удалось получить интерфейс CoLWRPredict. В этот момент я отредактировал файл rc, чтобы иметь запись для IDR_COLWRPREDICT, и создал файл rgs из существующей версии. Я ожидал увидеть новую запись в реестре после моей следующей чистой сборки. Но не идти.
Я посмотрел на различные файлы, которые, кажется, участвуют: resource.h, IxAsObjs.rc и CoLWRPredict.rgs. Я добавил необходимые записи для каждого и все компилируется, но я никогда не получаю запись reg для CLSID. Я внимательно изучил вхождения CLSID, но не вижу проблемы. ПОМОГИТЕ!
Я включаю фрагменты кода, которые кажутся наиболее подходящими ниже. Но я думаю, что мне не удалось правильно отформатировать файл rgs. Сожалею.
из файла idl, где установлен CLSID
[2.2. из CoLWRPredict.h, где появляется макрос DECLARE_REGISTRY_RESOURCEID
/////////////////////////////////////////////////////////////////////////////
// CCoLWRPredict
class ATL_NO_VTABLE CCoLWRPredict :
public CComObjectRootEx<CComSingleThreadModel>,
public CoBasePredict,
public CComCoClass<CCoLWRPredict, &CLSID_CoLWRPredict>,
public ISupportErrorInfo,
// public IDispatchImpl<IDALSPredict, &IID_IDALSPredict, &LIBID_IXASOBJSLib>,
public IULWRPredict
{
public:
CCoLWRPredict();
~CCoLWRPredict();
DECLARE_REGISTRY_RESOURCEID(IDR_COLWRPREDICT)
DECLARE_PROTECT_FINAL_CONSTRUCT()
BEGIN_COM_MAP(CCoLWRPredict)
// COM_INTERFACE_ENTRY(IDLWRPredict)
// COM_INTERFACE_ENTRY(IDispatch)
COM_INTERFACE_ENTRY(ISupportErrorInfo)
COM_INTERFACE_ENTRY(IULWRPredict)
END_COM_MAP()
STDMETHOD(InterfaceSupportsErrorInfo)(REFIID riid);
// IDLWRPredict does not exist
// IULWRPredict
public:
// snip!
resource.h где определяется COLWRPREDICT
// {{}} NO_DEPENDENCIES
// Microsoft Developer Studio сгенерировал включаемый файл.
// Используется IxAsObjs.rc
//
// удалил записи, чтобы сократить вопрос! ………………………… ..
// Следующие значения по умолчанию для новых объектов
//
// расширяем _APS_NEXT_SYMED_VALUE, чтобы он не конфликтовал с последним IDR_ выше
вещи из IxAsObs.rc
////////////////////////////////////////////////// ///////////////////////////
//
// РЕГИСТРАЦИЯ
//
IDR_COHCA ОТКЛЮЧИТЬ РЕГИСТРАЦИЮ «CoHCA.rgs» IDR_COTRANSFORM ОТКЛЮЧИТЬ РЕГИСТРАЦИЮ «CoTransform.rgs» // удалены записи, чтобы сократить вопрос! ………………………… ..
IDR_COPLSDAPREDICT REGISTRY DISCARDABLE «CoPLSDAPredict.rgs» IDR_COALGLINKEDMODEL REGISTRY DISCARDABLE «CoAlgLinkedModel.rgs» IDR_COLWRPREDICT РЕГИСТРАЦИЯ ОТКЛЮЧЕНО «CoLRG
CoLWRPredict.rgs
HKCR
{
IxAsObjs.CoLWRPredict.1 = s ‘CoLWRPredict Class’
{
CLSID = s ‘{E8D154F7-9364-4021-891F-6ABDA882B9B2}’
}
IxAsObjs.CoLWRPredict = s ‘CoLWRPredict Class’
{
CLSID = s ‘{E8D154F7-9364-4021-891F-6ABDA882B9B2}’
CurVer = s ‘IxAsObjs.CoLWRPredict.1’
}
NoRemove CLSID
{
ForceRemove {E8D154F7-9364-4021-891F-6ABDA882B9B2} = s ‘CoLWRPredict Class’
{
ProgID = s ‘IxAsObjs.CoLWRPredict.1’
VersionIndependentProgID = s ‘IxAsObjs.CoLWRPredict’
ForceRemove ‘Программируемый’
InprocServer32 = s ‘% MODULE%’
{
val ThreadingModel = s ‘Квартира’
}
‘TypeLib’ = s ‘{E040DFE0-A1CB-11D7-90EE-00104B317D58}’
}
}
}
Это довольно старый и OP имеет обходной путь, но похоже, что проблема в Visual Studio не работает от имени администратора. Может только regsvr32 с повышенными привилегиями.
Других решений пока нет …