А, да, следующая серия.
Итак, тестыТест1 - CPP
HKEY key;
LPOLESTR pstr;
StringFromCLSID(__uuidof(zlibEngine), &pstr);
CString cs = "CLSID\\";
cs += pstr;
CoTaskMemFree(pstr);
LONG res = RegOpenKeyEx(HKEY_CLASSES_ROOT, (LPCTSTR)cs, 0, KEY_READ, &key);
if (res == ERROR_SUCCESS)
RegCloseKey(key);
Msg("clsid open result %p", res);
CComPtr<IzlibEngine> zlib;
CLSID clsid;
HRESULT hr = CLSIDFromProgID(OLESTR("v75.zlibEngine"), &clsid);
Msg("clsid from progid result %p", hr);
hr = zlib.CoCreateInstance(__uuidof(zlibEngine));
Msg("zlib creation result %p", hr);
Первая часть - чтение CLSID из HKCR/HKLM, после переназначение HKCR в HKCU везде дает ошибку 2 (не найден).
Вторая часть - работа COM системы, на разных системах либо дает ошибку после переназначения, либо нет.
Что интересно, есть отличия даже в поведении 2003 sp1 и xp sp2.
Например, CLSIDFromProgID на 2003 выполняется всегда, а на xp после переобозначения дает ошибку 800401F3 (CO_E_CLASSSTRING).
На 2000 - 2000 sp3 CLSIDFromProgID и CoCreateInstance после переобозначения дают ошибку всегда.
Тест2 - 1С
Процедура Сформировать()
_ст =СоздатьОбъект("Система");
Попытка
_ст.РегистрироватьКомпонентыВ_HKCU(1);
_о =СоздатьОбъект("V77.Application");
Сообщить(_о);
Исключение
Сообщить(ОписаниеОшибки(), "!");
КонецПопытки;
Попытка
_ст.РегистрироватьКомпонентыВ_HKCU(0);
_о =СоздатьОбъект("V77.Application");
Сообщить(_о);
Исключение
Сообщить(ОписаниеОшибки(), "!");
КонецПопытки;
КонецПроцедуры
На 2000 - 2000 sp3 объект будет создан только 1 раз, при активном перенаправлении будет исключение.
Вот такие дела.
Ну и что дальше?Да, собственно, все.
Сама регистрация компоненты с учетом статической линковки к ATL работоспособна на всех текущих версиях 2000 - 2003 (по поводу vista - не знаю).
Методы RegOverridePredefKey() и РегистрироватьКомпонентыВ_HKCU() имеют серьезные подводные камни.
Не для гражданского применения.
А зачем вообще ты все это пишешь?Да для истории.
Ради карманных денег,
или всего святого,
или всего того, что...
Словом, всего того...
Всем удачи, за которую никто не спросит.