Продолжаем анализ экскрементов.
При загрузке под ХР.
Независимо от того, с какими правами грузится компонента, она регистрирует как ProgID и CLSID, так и Typelib в HKCU. После чего нормально грузится.
При загрузке под Вистой.
Если 1С запускается под обычным пользователем, либо не от имени администратора. То компонента нормально регистрирует ProgID и CLSID в HKCU, но при попытке зарегистрировать TypeLib происходит следующее:
Цитата:Operation: RegOpenKey
Result: NAME NOT FOUND
Path: HKCU\Software\Classes\TypeLib\{3A5F0172-87E1-4AB6-BE86-39066F6E0AB9}
Desired Access: Maximum Allowed
Operation: RegOpenKey
Result: NAME NOT FOUND
Path: HKCR\TypeLib\{3A5F0172-87E1-4AB6-BE86-39066F6E0AB9}
Desired Access: Maximum Allowed
Operation: RegOpenKey
Result: ACCESS DENIED
Path: HKCR\TypeLib\{3A5F0172-87E1-4AB6-BE86-39066F6E0AB9}
Desired Access: Maximum Allowed
То есть регистрация Typelib обламывается, но далее все нормально загружается, не смотря на TypeLib. Причем нормально загружается, даже если Typelib уже зарегистрирован.
Если же 1С запускать от имени администратора, то компонента регистрируется в HKCU, но Typelib, почему то, регистрируется в HKLM. А при загрузке возникает обычное сообщение "отсутствует интерфейс IInitDone". ПРИЧЕМ! Если компонента зарегистрирована как в HKCU, так и в HKLM, то она грузится нормально. (См. код ниже.)
Если же не выполнять регистрацию Typelib, то возникает та же ошибка: "отсутствует интерфейс IInitDone".
Короче, сейчас катит такой вариант:
STDAPI DllRegisterServer(void)
{
// registers object, typelib and all interfaces in typelib
HRESULT hr = _Module.RegisterServer(TRUE);
MessageBox("Регистрация сервера = %ld", hr);
RedirectHKCR(TRUE);
hr = _Module.RegisterServer(TRUE);
MessageBox("Регистрация сервера = %ld", hr);
RedirectHKCR(FALSE);
return hr;
}
Но как он поведет себя в многопользовательской среде с разными версиями 1С++ - не знаю.
Михаил, жду от тебя разъяснений анализа экскрементов.