Переключение на Главную Страницу Страницы: 1 ... 9 10 [11] 12 13 14 ОтправитьПечать
Очень популярная тема (более 25 ответов) Ошибка при создании объекта из компоненты (число прочтений - 167488 )
sedmin
1c++ developer
Отсутствует


I Hate Fat YaBB 2!

Сообщений: 862
Зарегистрирован: 24. Мая 2006
Re: Ошибка при создании объекта из компоненты
Ответ #150 - 09. Сентября 2007 :: 19:25
Печать  
Цитата:
С одной стороны, через HKCR после переназначения мы не имеем доступа в части HKLM.

Почему не имеем? На запись не имеем, а на чтение тот же доступ, что и без переназначение. По крайней мере так следует из описания.

Цитата:
На NT4 и на Win9x нет такого экспорта RegOverridePredefKey в ADVAPI32.DLL (это точно).
Так что шанс примерно 100%, что такое решение именно "не заведется". Печаль

Да, действительно. Попробую на виртуальной 98-ой и сообщу о результатах. Но только во вторник.
Если не пойдет, то тогда придется делать позднее связывание. Ты же умеешь его делать? Поделишься?  Улыбка
  
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Ошибка при создании объекта из компоненты
Ответ #151 - 09. Сентября 2007 :: 21:20
Печать  
sedmin писал(а) 09. Сентября 2007 :: 19:25:
Почему не имеем? На запись не имеем, а на чтение тот же доступ, что и без переназначение. По крайней мере так следует из описания.

Ну эээ... Описание описанием, а доступа нетути.
Далеко ходить не надо, попробуй пробежаться по ключам HKCR после переназначения с помощью того же РаботаСРегистромWin (HKCR в части HKLM увидеть не должен, я на 2003 не вижу).
Стал бы я второй день подряд тут просто так репу чесать. Улыбка

Цитата:
Да, действительно. Попробую на виртуальной 98-ой и сообщу о результатах. Но только во вторник.
Если не пойдет, то тогда придется делать позднее связывание. Ты же умеешь его делать? Поделишься?  Улыбка


Как-то так:  (при необходимости обработать напыльником):
Код
Выбрать все
typedef LONG (f_LONG_HKEY_HKEY)(HKEY, HKEY);
void RedirectHKCR(BOOL bRedirect)
{
	static f_LONG_HKEY_HKEY* pRegOverridePredefKey = NULL;
	static BOOL bUnsupported = FALSE;

	if (!pRegOverridePredefKey && !bUnsupported)
	{
		OSVERSIONINFO vi;
		vi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
		GetVersionEx(&vi);

		if (vi.dwMajorVersion < 5)
			bUnsupported = TRUE;
		else
		{
			HMODULE hm = GetModuleHandle("ADVAPI32.DLL");
			if (hm)
				pRegOverridePredefKey = reinterpret_cast<f_LONG_HKEY_HKEY*>(GetProcAddress(hm, "RegOverridePredefKey"));

			if (!pRegOverridePredefKey)
				bUnsupported = TRUE;
		}
	}

	if (!bUnsupported)
	{
		if (bRedirect)
		{
			HKEY hNewHKey;
			RegOpenKeyEx(HKEY_CURRENT_USER, "Software\\Classes", 0, KEY_READ|KEY_WRITE , &hNewHKey  );
			(*pRegOverridePredefKey)(HKEY_CLASSES_ROOT, hNewHKey);
			RegCloseKey(hNewHKey);
		}
		else
			(*pRegOverridePredefKey)(HKEY_CLASSES_ROOT, NULL);
	}
}
 


  

De quelle planète es-tu?
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Ошибка при создании объекта из компоненты
Ответ #152 - 10. Сентября 2007 :: 11:18
Печать  
Да, Саша, и в процессе тестирования чисто практический вопрос возник.

На системах типа win2k sp2, sp3 возникает ошибка 0x80040154 при вызове _Module.RegisterServer(TRUE).
Фактически в ветке HKCU регистрации не происходит.

На системах с win2k sp4 и xp, 2003 такой проблемы нет.

Понятно, что делать (поставим sp4), но причина непонятна.
Если будет информация по вашим результатам тестов в подобном окружении, это будет интересно.
  

De quelle planète es-tu?
Наверх
 
IP записан
 
sedmin
1c++ developer
Отсутствует


I Hate Fat YaBB 2!

Сообщений: 862
Зарегистрирован: 24. Мая 2006
Re: Ошибка при создании объекта из компоненты
Ответ #153 - 11. Сентября 2007 :: 04:48
Печать  
kms писал(а) 10. Сентября 2007 :: 11:18:
На системах типа win2k sp2, sp3 возникает ошибка 0x80040154 при вызове _Module.RegisterServer(TRUE).
Фактически в ветке HKCU регистрации не происходит.

На системах с win2k sp4 и xp, 2003 такой проблемы нет.

Можно уточнить проверку версии Windows. Что скажешь?
  
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Ошибка при создании объекта из компоненты
Ответ #154 - 11. Сентября 2007 :: 07:10
Печать  
sedmin писал(а) 11. Сентября 2007 :: 04:48:
Можно уточнить проверку версии Windows. Что скажешь?

Да придется, наверное, если не поймем, чем дело.

Вот еще что нашел (о манифестах и Registration-Free COM), для XP sp2 и 2003:
http://msdn2.microsoft.com/en-us/library/ms973913.aspx
  

De quelle planète es-tu?
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Ошибка при создании объекта из компоненты
Ответ #155 - 11. Сентября 2007 :: 10:00
Печать  
sedmin писал(а) 11. Сентября 2007 :: 04:48:

ОФФ. Ты асю смотришь? я тебе там кучу сообщений понаписал, а ты молчишь Печаль
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer &amp;&amp; tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
sedmin
1c++ developer
Отсутствует


I Hate Fat YaBB 2!

Сообщений: 862
Зарегистрирован: 24. Мая 2006
Re: Ошибка при создании объекта из компоненты
Ответ #156 - 11. Сентября 2007 :: 10:30
Печать  
kms писал(а) 09. Сентября 2007 :: 21:20:
Как-то так:  (при необходимости обработать напыльником):

Теперь твой вариант не завелся. Ты его пробовал? Сейчас "Память не может быть read."
Причем, если собрать отладочный вариант, то все работает...

Зато на Win98 все работает.  Подмигивание

Цитата:
Вот еще что нашел (о манифестах и Registration-Free COM), для XP sp2 и 2003:

Ты прости, но мне не хотелось бы сейчас погружаться в эту тему...  Печаль
  
Наверх
 
IP записан
 
sedmin
1c++ developer
Отсутствует


I Hate Fat YaBB 2!

Сообщений: 862
Зарегистрирован: 24. Мая 2006
Re: Ошибка при создании объекта из компоненты
Ответ #157 - 11. Сентября 2007 :: 11:10
Печать  
Кстати, падение происходит при возврате из RedefineHKCR().
То есть последняя строчка из RedefineHKCR(), а следующая из DllRegisterServer() уже не выполняется.
Что-то с очисткой стека, я полагаю...
  
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Ошибка при создании объекта из компоненты
Ответ #158 - 11. Сентября 2007 :: 11:40
Печать  
sedmin писал(а) 11. Сентября 2007 :: 10:30:
Теперь твой вариант не завелся. Ты его пробовал? Сейчас "Память не может быть read."

Щас примерно такой вариант и тестируется.

На какой системе не завелся? Релизный, собранный vc6, правильно?

Цитата:
Цитата:
Вот еще что нашел (о манифестах и Registration-Free COM), для XP sp2 и 2003:

Ты прости, но мне не хотелось бы сейчас погружаться в эту тему...  Печаль

Мне тоже.
Это для будущих поколений Улыбка
  

De quelle planète es-tu?
Наверх
 
IP записан
 
sedmin
1c++ developer
Отсутствует


I Hate Fat YaBB 2!

Сообщений: 862
Зарегистрирован: 24. Мая 2006
Re: Ошибка при создании объекта из компоненты
Ответ #159 - 11. Сентября 2007 :: 11:47
Печать  
Не завелись предложенные тобой изменения на Win 2000/XP. Сборка на VC6.
  
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Ошибка при создании объекта из компоненты
Ответ #160 - 11. Сентября 2007 :: 11:59
Печать  
sedmin писал(а) 11. Сентября 2007 :: 11:47:
Не завелись предложенные тобой изменения на Win 2000/XP. Сборка на VC6.

ОК, порешаем.
Саша, если сможешь куда-нибудь залить свой исходник и релиз (проблемные), будет здорово.
  

De quelle planète es-tu?
Наверх
 
IP записан
 
sedmin
1c++ developer
Отсутствует


I Hate Fat YaBB 2!

Сообщений: 862
Зарегистрирован: 24. Мая 2006
Re: Ошибка при создании объекта из компоненты
Ответ #161 - 11. Сентября 2007 :: 12:02
Печать  
Файл GlobalMethods.cpp. Тупо залил твою реализацию. Не заводится, падает.
  
Наверх
 
IP записан
 
sedmin
1c++ developer
Отсутствует


I Hate Fat YaBB 2!

Сообщений: 862
Зарегистрирован: 24. Мая 2006
Re: Ошибка при создании объекта из компоненты
Ответ #162 - 11. Сентября 2007 :: 12:57
Печать  
Вот код. В результате сбивается ESP. Наверное, нужно иначе описать pRegOverridePredefKey.

Код
Выбрать все
78:		   RegOverridePredefKey(HKEY_CLASSES_ROOT, hNewHKey);
2402CD14 8B 54 24 00	      mov	   edx,dword ptr [esp]
2402CD18 52		      push	  edx
2402CD19 68 00 00 00 80	      push	  80000000h
2402CD1E FF 15 2C 80 0E 24    call	  dword ptr [__imp__RegOverridePredefKey@8 (240e802c)]
79:		   (*pRegOverridePredefKey)(HKEY_CLASSES_ROOT, hNewHKey);
2402CD24 8B 44 24 00          mov         eax,dword ptr [esp]
2402CD28 50                   push        eax
2402CD29 68 00 00 00 80       push        80000000h
2402CD2E FF 15 20 FF 12 24    call        dword ptr [cCryptKeyList+8 (2412ff20)]
2402CD34 8B 4C 24 08          mov         ecx,dword ptr [esp+8]
2402CD38 83 C4 08             add         esp,8
 

  
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Ошибка при создании объекта из компоненты
Ответ #163 - 11. Сентября 2007 :: 14:12
Печать  
sedmin писал(а) 11. Сентября 2007 :: 12:57:
Наверное, нужно иначе описать pRegOverridePredefKey.


Точно.
Напильником все же надо было пройтись: Улыбка
Код
Выбрать все
typedef LONG (APIENTRY f_LONG_HKEY_HKEY)(HKEY, HKEY);
 



По остальным вопросам тоже есть ответы, сегодня напишу.
  

De quelle planète es-tu?
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Ошибка при создании объекта из компоненты
Ответ #164 - 11. Сентября 2007 :: 14:43
Печать  
Итак, откинтесь на спинку стула, возьмите чашечку кофе.
Сейчас я расскажу страшную тайну... Ужас

Краткое содержание предыдущих серий:

Мысль о регистрации компонент в 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- и.т.д.)
  

De quelle planète es-tu?
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1 ... 9 10 [11] 12 13 14
ОтправитьПечать