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



Сообщений: 2537
Местоположение: Нижний Новгород
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Ошибка при создании объекта из компоненты
Ответ #135 - 08. Сентября 2007 :: 15:27
Печать  
Поздравляю!   Улыбка
  
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Ошибка при создании объекта из компоненты
Ответ #136 - 08. Сентября 2007 :: 15:33
Печать  
sedmin писал(а) 08. Сентября 2007 :: 12:27:
Теперь для всех версий Windows!  Подмигивание

Авот%уй (с) (на nt4 не заведется)
Ну это так, для поддержания разговора Улыбка
  

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


I Hate Fat YaBB 2!

Сообщений: 862
Зарегистрирован: 24. Мая 2006
Re: Ошибка при создании объекта из компоненты
Ответ #137 - 08. Сентября 2007 :: 15:47
Печать  
kms писал(а) 08. Сентября 2007 :: 15:33:
sedmin писал(а) 08. Сентября 2007 :: 12:27:
Теперь для всех версий Windows!  Подмигивание

Авот%уй (с) (на nt4 не заведется)
Ну это так, для поддержания разговора Улыбка


Ты смотрел? Смотря что не заведется.

На NT4 все работает по-старому. Раздавайте права на HKLM.
  
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Ошибка при создании объекта из компоненты
Ответ #138 - 08. Сентября 2007 :: 15:59
Печать  
sedmin писал(а) 08. Сентября 2007 :: 12:27:
Проблема загрузки внешних компонент решена!
Теперь для всех версий Windows!


sedmin писал(а) 08. Сентября 2007 :: 15:47:
На NT4 все работает по-старому


Не для всех версий, дядь Саш, не для всех.
Что, впрочем не умаляет ценности идеи alexqc, твоей реализации и наших надежд.
  

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


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Ошибка при создании объекта из компоненты
Ответ #139 - 08. Сентября 2007 :: 16:04
Печать  
sedmin
По-существу, в этом решении меня интересует только один старый вопрос:

kms писал(а) 30. Июня 2006 :: 11:34:
alexqc писал(а) 30. Июня 2006 :: 09:53:
Так получается, если при загрузке dll компоненты выполнить примерно такое

HKEY hNewHKey;
RegOpenKeyEx(HKEY_CURRENT_USER, "Software\\Classes", 0, KEY_READ|KEY_WRITE , &hNewHKey  );
RegOverridePredefKey(HKEY_CLASSES_ROOT, hNewHKey);
RegCloseKey(hNewHKey);

тогда вся работа с HKCR перемапится на подветку HKCU. (и может даже не с одной компонентой, а с последующими? это надо проверять, но если так - одним махом решиться проблема со ВСЕМИ компонентами). Работать будет, естественно, только на 2000+, поэтому ее надо через LoadLibrary/GetProcAddress искать.

Хорошо, что ты с этим разбираешься, но вроде сейчас проблема решена уже по разным направлениям.

А в варианте с RegOverridePredefKey() мне интересно, вся работа с COM после этого не накроется? Ужас
Тоже не проверял, боюс. Улыбка


Если пользователь включает переопределение HKCR, что будет дальше при попытке создания COM-объекта, зарегистрированного в HKLM?
  

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


I Hate Fat YaBB 2!

Сообщений: 862
Зарегистрирован: 24. Мая 2006
Re: Ошибка при создании объекта из компоненты
Ответ #140 - 08. Сентября 2007 :: 19:00
Печать  
Цитата:
Не для всех версий, дядь Саш, не для всех.

А для каких не будет работать? Если раньше работало для NT4, то и теперь будет работать.

Цитата:
Если пользователь включает переопределение HKCR, что будет дальше при попытке создания COM-объекта, зарегистрированного в HKLM?

При создании или при /регистрации и создании/?

Мне не понятны твои вопросы. Ты код смотрел? Там все просто. И даже если не смотрел, то ты же знаешь, как работает функция переназначения веток реестра. Если не помнишь - прочитай еще раз, и будет все ясно.

Задай, пожалуйста, вопрос конкретнее. Я на него отвечу.
  
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Ошибка при создании объекта из компоненты
Ответ #141 - 08. Сентября 2007 :: 19:01
Печать  
+
Вот, тестик набросал.
Код
Выбрать все
	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;
	HRESULT hr = zlib.CoCreateInstance(__uuidof(zlibEngine));
	Msg("zlib creation result %p", hr);
 


Открыть CLSID, расположенный в HKLM после переобозначения HKCR не удается.
В то же время, создание объекта проходит удачно всегда.
Причем в regmon четко видно, что процесс открывает ту же самую ветку, чтение которой только что обломалось и именно через HKCR.

It's definitely some sort of dark magic... Улыбка

Но с регистрацией самой компоненты, думаю, все будет хорошо.
  

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


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Ошибка при создании объекта из компоненты
Ответ #142 - 08. Сентября 2007 :: 19:11
Печать  
sedmin писал(а) 08. Сентября 2007 :: 19:00:
А для каких не будет работать? Если раньше работало для NT4, то и теперь будет работать.

Саша, это игра слов. Ты чето слишком серьезно ее воспринял.
Под NT4 нет возможности регистрировать в HKCU, так что твое решение не будет работать в NT4.
Ты сказал, что решил для всех ос, но для NT4 проблема-то с необходимостью прав администратора сохраняется.
Или нет?

Цитата:
Цитата:
Если пользователь включает переопределение HKCR, что будет дальше при попытке создания COM-объекта, зарегистрированного в HKLM?

При создании или при /регистрации и создании/?

Ну, посмотри код выше и скажи, почему мне удается создавать zlib в то время, как ветка реестра (clsid) недоступна?

Применительно к 1С, этот вопрос звучит так:
Код
Выбрать все
RedirectHKCR(1); // не помню, как ты ее назвал в 1С
об = СоздатьОбъект("Excel.Application");
 


Где гарантии, что объект удастся создать?
В моем тесте видно, что объект создается, но гарантии где?
Документировано ли это поведение?

И.т.д.

Я не сказал, что это обязательно приведет к проблемам, я просто отметил, что здесь есть непонятные пока моменты.
Которые могут привести к проблемам.

Угу?
  

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


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Ошибка при создании объекта из компоненты
Ответ #143 - 08. Сентября 2007 :: 19:27
Печать  
Вот еще среди прочего попалась статья Фила Вильсона на эту тему:
http://www.ddj.com/windows/184416328

Там есть секция "possible problems", в которой Филу пришлось переносить CLSID'ы из HKCR (HKLM, читай) в замещающую ветвь, чтобы заставить работать тот самый CoCreateInstance.
Забавно, что у меня таких проблем не оказалось.

Но, возможно, они еще у кого-то впереди. Улыбка
  

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


I Hate Fat YaBB 2!

Сообщений: 862
Зарегистрирован: 24. Мая 2006
Re: Ошибка при создании объекта из компоненты
Ответ #144 - 08. Сентября 2007 :: 19:53
Печать  
Цитата:
Открыть CLSID, расположенный в HKLM после переобозначения HKCR не удается.
В то же время, создание объекта проходит удачно всегда.
Причем в regmon четко видно, что процесс открывает ту же самую ветку, чтение которой только что обломалось и именно через HKCR.

Ну и что? Возможно, он идет туда с другими правами. Что ты хочешь сказать?

Цитата:
Ты сказал, что решил для всех ос, но для NT4 проблема-то с необходимостью прав администратора сохраняется.
Или нет?

Ну это же игра слов, ты же сам сказал. Очень довольный Там же написано, что это работает для Windows 2000 и выше. Улыбка
Суть в том, что хуже не стало. И все работает в том числе и для Win95/98.
Хотя я знаю извращенцев которые для Win98 лишают ползователей прав на реестр. И у них загрузка компонент нормально работать не будет. Но в жизни же всегда есть место подвигу!

Цитата:
Ну, посмотри код выше и скажи, почему мне удается создавать zlib в то время, как ветка реестра (clsid) недоступна?

Я что-то писал про COM-объекты? Я писал про внешние компоненты 1С. Которые при загрузке перерегистрируют себя.
Так что проблем быть не должно. По крайней мере, в течении полугода использования предыдущего решения проблемы выявились только с Win98. В ней регистрация в HKCU не помогает (мягко говоря Смех).
Плюс к тому, регистрацию компоненты в HKCU средствами 1С выполнять неудобно.
Вот так.
  
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Ошибка при создании объекта из компоненты
Ответ #145 - 08. Сентября 2007 :: 20:22
Печать  
sedmin писал(а) 08. Сентября 2007 :: 19:53:
Цитата:
Открыть CLSID, расположенный в HKLM после переобозначения HKCR не удается.
В то же время, создание объекта проходит удачно всегда.
Причем в regmon четко видно, что процесс открывает ту же самую ветку, чтение которой только что обломалось и именно через HKCR.

Ну и что? Возможно, он идет туда с другими правами. Что ты хочешь сказать?


Я не очень понял, кто "он" и куда идет и с какими правами.
Вопрос по-моему вполне внятно сформулирован: почему мы можем создавать объекты, зарегистрированные в HKLM, после того как мы переобозначили HKCR в HKCU.

Мы не имеем доступа по чтению и не можем сделать энумерацию ключей HKCR в части HKLM, но объекты создавать можем.
Странно? Мне - странно.

CLSIDfromProgID() тоже, кстати работает, к реестру обращение выглядит примерно так:
Цитата:
OpenKey      HKCR\v75.zlibEngine      SUCCESS      Key: 0xE63137F8      

Т.е. мы через HKCR (который переобозначен в HKCU) спокойно читаем ключ v75.zlibEngine, который находится в HKLM.

Странно? Мне - да.

И речь не о том, что все работает.Речь о том, будет ли оно работать завтра.
Мы предполагаем, что будет, но оснований для этого я лично пока не вижу.

Цитата:
Я что-то писал про COM-объекты?

Именно.
Да я заметил, что не писал, а хотя бы обдумать это следовало бы.

Ну да ладно, поскольку нам все равно никто не ответит, давайте-ка лучше праздновать. Улыбка
  

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


I Hate Fat YaBB 2!

Сообщений: 862
Зарегистрирован: 24. Мая 2006
Re: Ошибка при создании объекта из компоненты
Ответ #146 - 09. Сентября 2007 :: 06:18
Печать  
MSDN-а у меня дома нет, поэтому цитаты тебе привести не смогу. Можешь поискать у себя или в онлайне.

Но суть там ОЧЕНЬ простая. Есть два момента, их не надо смешивать. (Хотя, может быть и надо. Подмигивание)

1) Чтение реестра.
   
  • Ветка реестра HKCR является подветкой HKLM.
       
  • Начиная с Win2000 HKCR становится солянкой из HKLM и HKCU. Если есть ключ в HKCU, то читается он.

    2) Запись в ветку HKCR.
  • До Win2000 запись идет в HKLM.
  • В Win2000 и выше при наличии ключа в HKCU запись ведется в него. Иначе в HKLM. Но есть еще такие штуки как NOREMOVE и FORCEREMOVE.
  • Если мы используем переназначение HKCR, то вся запись ведется в HKCU.

    Три цитаты.

    Цитата:
    Из MSDN.
    Инструкция ForceRemove указывает, что раздел и все содержащиеся в нем значения и подразделы должны удаляться. Ключевое слово ForceRemove обеспечивает также повторное создание раздела реестра при регистрации объекта BHO, если раздел уже существует.


    Цитата:
    another keyword, ForceRemove, which means that if the key exists, it will be deleted before the new key is written.


    Цитата:
    Еще из MSDN.
    The ForceRemove statement provides a housekeeping function by removing a key and all of its subkeys before re-creating the key. This can be useful if the names of the subkeys have changed.
  •   
    Наверх
     
    IP записан
     
    kms
    1c++ power user
    1c++ moderator
    Отсутствует


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

    Сообщений: 4632
    Зарегистрирован: 19. Мая 2006
    Re: Ошибка при создании объекта из компоненты
    Ответ #147 - 09. Сентября 2007 :: 08:05
    Печать  
    sedmin писал(а) 09. Сентября 2007 :: 06:18:
    Но суть там ОЧЕНЬ простая. Есть два момента, их не надо смешивать. (Хотя, может быть и надо. Подмигивание)

    ... из книги Савельича "клей момент: секреты бывалых"

    Цитата:
    1) Чтение реестра.
    2) Запись в ветку HKCR.


    Сань, все это правильно, но ты опять никак не поймаешь мою мысль.

    Есть еще п.3
    3) Работа подсистемы COM

    Как организовано хранение информации о COM объектах мы знаем.
    Это грубо ветка HKCR, которая действительно складывается из HKCU и HKLM.
    В корень пишутся ProgID, в ветку CLSID пишутся (кто бы мог подумать!) CLSID, плюс интерфейсы, тайплибы, это не суть.

    Предположим, из 1С мы вызвали метод РегистрироватьКомпонентыВ_HKCU(1).
    И бросили, типа компоненты будут регистрироваться в HKCU.

    Вопрос: сможем ли мы создавать COM-объекты, зарегистрированные ранее в HKLM?

    С одной стороны, через HKCR после переназначения мы не имеем доступа в части HKLM.
    С другой стороны, создание объектов продолжает работать (по крайней мере, на svr 2003 sp1)

    Тут интересным оказывается факт, что RegOverridePredefKey() по-разному влияет на методы типа RegCreateEx(), RegOpenEx() и т.д, и на методы COM-системы типа CoCreateInstance(), CLSIDFromProgID() и т.п.

    По моему мнению, первая группа учитывает переназначение, а вторая - игнорирует.
    На данный момент, неизвестно на чем основано такое поведение, поэтому нет уверенности, что на всех системах оно будет ожидаемым.

    Цитата:
    Но в жизни же всегда есть место подвигу!

    Эт точно. Улыбка
      

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


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

    Сообщений: 4632
    Зарегистрирован: 19. Мая 2006
    Re: Ошибка при создании объекта из компоненты
    Ответ #148 - 09. Сентября 2007 :: 11:47
    Печать  
    А вот сам метод регистрации компоненты в HKCU в чистом виде очень понравился.
    Код
    Выбрать все
    	RedirectHKCR(TRUE);
    	HRESULT hr = _Module.RegisterServer(TRUE);
    	RedirectHKCR(FALSE);
     
    
    


    Проблем не дает почти нигде, что бы я не пробовал (страшные извращения в расчет не берем).

    Выбор редакции, адназначна! Улыбка
      

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


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

    Сообщений: 4632
    Зарегистрирован: 19. Мая 2006
    Re: Ошибка при создании объекта из компоненты
    Ответ #149 - 09. Сентября 2007 :: 13:05
    Печать  
    sedmin писал(а) 08. Сентября 2007 :: 15:47:
    kms писал(а) 08. Сентября 2007 :: 15:33:
    sedmin писал(а) 08. Сентября 2007 :: 12:27:
    Теперь для всех версий Windows!  Подмигивание

    Авот%уй (с) (на nt4 не заведется)
    Ну это так, для поддержания разговора Улыбка


    Ты смотрел? Смотря что не заведется.
    На NT4 все работает по-старому. Раздавайте права на HKLM.


    Вот еще что вспомнил.

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

    Возможно, стоит получать адрес динамически.
      

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