Итак, откинтесь на спинку стула, возьмите чашечку кофе.
Сейчас я расскажу страшную тайну...
Краткое содержание предыдущих серий:
Мысль о регистрации компонент в HKCU вместо HKLM путем использования RegOverridePredefKey() пришла в светлую голову AlexQC давно, больше года назад.
И практически в тот же момент был сформулирован основной вопрос: не повлияет ли использование RegOverridePredefKey() на работоспособность системы компонент (COM), не разрушит ли?
Вопрос не праздный.В нескольких предыдущих постах я подробно описал свои опасения: действительно, переназначая ветку HKCR в HKCU мы "отрезаем" информацию о регистрации множества классов, зарегистрированных в HKLM.
Были созданы тесты на cpp и в 1С, которые дали интересный результат: на операции обращения к реестру типа RegQueryValueEx, RegCreateValueEx и т.п. использование RegOverridePredefKey оказывает влияние, а вот на систему компонент (CoCreateInstance, CLSIDfromProgID) - нет.
Замечу, что тесты я прогонял на XP и 2003 sp1.
И вот в тот момент, когда я уже почти поверил, что все хорошо... начались проблемы (как будто бывает по другому).
На системах win2k - win2k sp3 компонента напрочь отказывалась регистрироваться.
_Module.RegisterServer() возвращал 0x80040154 (class not registered) - и все.
Ну а причина-то в чем?А причина-то как раз оказались в том, что на системах win2k до sp4 после использования RegOverridePredefKey система компонент как раз оказывается неработоспособна.
Более того, в случае динамической линковки к atl.dll даже неспособна на регистрацию класса, ибо процедура регистрации сама является COM-клиентом и создает в процессе регистрации экземпляры класса Registrar Class (44EC053A- и.т.д.)