Re: Class ID problems
On Jul 11, 1:57 pm, "Igor Tandetnik" <itandet...@mvps.org> wrote:
John Shell <anonym...@nospam.com> wrote:
I have a COM DLL project which is giving me a big headache. A couple
of the COM classes of the project have class IDs different in the
generated h file than what they are in the registry.
Make sure the GUIDs in the IDL file agree with those in RGS files.
I have run into this before w/ VC6, usually when I am using source
control & some files are read-only because I forget to check out some
of the files before using the Wizard. Then the Wizard fails, I
remember to make all the files read-writeable, and then when I run the
Wizard again, it recognizes a new COM class already exists in one
file, so it doesn't bother overwriting it, but it also doesn't bother
to check the GUID and so there's one GUID in the IDL and another in
the .rgs files.
My eyes have been recently opened to the use of
CComCoClass::UpdateRegistry(); this is a static method that you can
override in your class to use string substitutions, and then you can
get rid of those stupid Wizard-ized .rgs files and replace them with
something generic like this (I do things a little bit differently
using a helper class instead of declaring all those CComBSTR's):
[in your .h file for your class]
static STDMETHODIMP CMyClass::UpdateRegistry(BOOL bRegister)
{
CComBSTR bstrDescription;
CComBSTR bstrCLSID(CLSID_MyClass); // autogenerated from IDL file
CComBSTR bstrPROGID(L"MyServer.MyClass");
CComBSTR bstrVersion(L"1");
CComBSTR bstrThreadModel(L"1");
CComBSTR bstrTypeLibID(LIBID_MYLIB); // autogenerated from IDL file
bstrDescription.LoadString(IDS_MYCLASS_DESCRIPTION); // load from
resource stringtable
_ATL_REGMAP_ENTRY rm[] = {
{ OLESTR("DESCRIPTION"), bstrDescription },
{ OLESTR("CLSID"), bstrCLSID },
{ OLESTR("PROGID"), bstrProgID },
{ OLESTR("PROGVER"), bstrVersion },
{ OLESTR("THREADMODEL"), bstrThreadModel },
{ OLESTR("TYPELIBID"), bstrTypeLibID },
{ NULL,NULL } };
return _Module.UpdateRegistryFromResource(IDR_MYCLASS, bRegister,
rm);
}
then in your .rgs file:
HKCR
{
%PROGID%.%PROGVER% = s '%DESCRIPTION%'
{
CLSID = s '%CLSID%'
}
%PROGID% = s '%DESCRIPTION%'
{
CLSID = s '%CLSID%'
CurVer = s '%PROGID%.%PROGVER%'
}
NoRemove CLSID
{
ForceRemove %CLSID% = s '%DESCRIPTION%'
{
ProgID = s '%PROGID%.%PROGVER%'
VersionIndependentProgID = s '%PROGID%'
ForceRemove 'Programmable'
InprocServer32 = s '%MODULE%'
{
val ThreadingModel = s '%THREADMODEL%'
}
'TypeLib' = s '%TYPELIBID%'
}
}
}