Опишу как я решил проблему у себя. Может кому пригодится.
*.idl файлТут объявил два интерфейса и два класса для двух языков (ru, en) с разными гуидами:
//- Interface definition
// ENG
[
object,
uuid(23FFF105-B579-41CD-9ECB-F39B2D7A2241), // New for 2013
dual,
nonextensible,
helpstring("ITraceCOMObjEng Interface"),
pointer_default(unique)
]
interface ITraceCOMObjEng : IAcadEntity {
[propget, id(1), helpstring("Name of trace")] HRESULT TraceName([out, retval] BSTR* pVal);
[propput, id(1), helpstring("Name of trace")] HRESULT TraceName([in] BSTR newVal);
.....
};
//- Library section of interface ITraceCOMObjEng
[
uuid(06F84F9F-51D4-45A3-939E-C9E3827221E9), // New for 2013
helpstring("TraceCOMObjEng Class")
]
coclass TraceCOMObjEng
{
[default] interface ITraceCOMObjEng;
[source] interface IAcadObjectEvents;
};
//---------------------------------------------------------------------------
//- Interface definition
// RUS
[
object,
uuid(6D95A6D8-DC71-4754-BB91-19D356DEEE39), // New for 2013
dual,
nonextensible,
helpstring("ITraceCOMObjRus Interface"),
pointer_default(unique)
]
interface ITraceCOMObjRus : IAcadEntity {
[propget, id(1), helpstring("Наименование трассы")] HRESULT TraceName([out, retval] BSTR* pVal);
[propput, id(1), helpstring("Наименование трассы")] HRESULT TraceName([in] BSTR newVal);
....
};
//- Library section of interface ITraceCOMObjRus
[
uuid(3F390E44-9DBF-476F-BB57-947DBAD53498), // New for 2013
helpstring("TraceCOMObjRus Class")
]
coclass TraceCOMObjRus
{
[default] interface ITraceCOMObjRus;
[source] interface IAcadObjectEvents;
};
*.rgs файлЗарегистрировал эти два COM объекты:
HKCR
{
UnisTraceDBX.TraceCOMObjEng.1 = s 'TraceCOMObjEng Class'
{
CLSID = s '{06F84F9F-51D4-45A3-939E-C9E3827221E9}'
}
UnisTraceDBX.TraceCOMObjEng = s 'TraceCOMObjEng Class'
{
CLSID = s '{06F84F9F-51D4-45A3-939E-C9E3827221E9}'
CurVer = s 'UnisTraceDBX.TraceCOMObjEng.1'
}
NoRemove CLSID
{
ForceRemove {06F84F9F-51D4-45A3-939E-C9E3827221E9} = s 'TraceCOMObjEng Class'
{
ProgID = s 'UnisTraceDBX.TraceCOMObjEng.1'
VersionIndependentProgID = s 'UnisTraceDBX.TraceCOMObjEng'
ForceRemove 'Programmable'
InprocServer32 = s '%MODULE%'
{
val ThreadingModel = s 'Apartment'
}
val AppID = s '%APPID%'
'TypeLib' = s '{33FDA779-B116-418C-89A2-198962137723}'
}
}
UnisTraceDBX.TraceCOMObjRus.1 = s 'TraceCOMObjRus Class'
{
CLSID = s '{3F390E44-9DBF-476F-BB57-947DBAD53498}'
}
UnisTraceDBX.TraceCOMObjRus = s 'TraceCOMObjRus Class'
{
CLSID = s '{3F390E44-9DBF-476F-BB57-947DBAD53498}'
CurVer = s 'UnisTraceDBX.TraceCOMObjRus.1'
}
NoRemove CLSID
{
ForceRemove {3F390E44-9DBF-476F-BB57-947DBAD53498} = s 'TraceCOMObjRus Class'
{
ProgID = s 'UnisTraceDBX.TraceCOMObjRus.1'
VersionIndependentProgID = s 'UnisTraceDBX.TraceCOMObjRus'
ForceRemove 'Programmable'
InprocServer32 = s '%MODULE%'
{
val ThreadingModel = s 'Apartment'
}
val AppID = s '%APPID%'
'TypeLib' = s '{33FDA779-B116-418C-89A2-198962137723}'
}
}
}
Кода не много, и он простой, главное не напутать с гуидами. Но вот сам код COM-класса большой, у меня много проперти неохотно дублировать логики работы с ними.
*.h файл COM-класа// Шаблонный класс палитры свойств для локализации
template <class ClassType, class InterfaceType, const CLSID* CLSIDtype, const IID* IIDtype>
class ATL_NO_VTABLE CTraceCOMObj
: public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<ClassType, CLSIDtype>,
public IAcPiCategorizeProperties,
public IOPMPropertyExtensionImpl<ClassType>,
public ISupportErrorInfo,
public IAcadEntityDispatchImpl<ClassType, CLSIDtype, InterfaceType, IIDtype, &LIBID_UnisTraceDBXLib>
#ifdef NEVER
, public IDispatchImpl<IProfileCOMObjEng, &IID, &LIBID_UnisProfileDBXLib>
#endif
{
...
/// всю логику работы с палитрой пишем здесь
...
};
//////////////////////////////////////////////////////////////////////////
// Оглавление двух классов пустышек для разных локализаций
//////////////////////////////////////////////////////////////////////////
// Класс палитры свойств трассы для английского языка
class ATL_NO_VTABLE CTraceCOMObjEng : public CTraceCOMObj<CTraceCOMObjEng, ITraceCOMObjEng, &CLSID_TraceCOMObjEng, &IID_ITraceCOMObjEng>{};
OBJECT_ENTRY_AUTO(__uuidof(TraceCOMObjEng), CTraceCOMObjEng)
// Класс палитры свойств трассы для русского языка
class ATL_NO_VTABLE CTraceCOMObjRus : public CTraceCOMObj<CTraceCOMObjRus, ITraceCOMObjRus, &CLSID_TraceCOMObjRus, &IID_ITraceCOMObjRus>{};
OBJECT_ENTRY_AUTO(__uuidof(TraceCOMObjRus), CTraceCOMObjRus)
Ну вот и все. Локализированные подсказки конечно пишем в *.idl файле.