Регистрация COM-объекта из своей программы
От: Melamed Россия  
Дата: 20.07.23 09:21
Оценка:
При регистрации СОМ объекта в своей программе вызов функции CODllRegisterServer из своей задачи выдает ошибку 0x80070005 "Отказано в доступе" Системная утилита Regsvr32 регистрирует COM-объекты только когда запущена под администратором системы. Думаю, для регистрации новых COM-объектов не хватает каких-то привилегий
Re: Регистрация COM-объекта из своей программы
От: bnk СССР http://unmanagedvisio.com/
Дата: 20.07.23 09:32
Оценка:
Здравствуйте, Melamed, Вы писали:

M>При регистрации СОМ объекта в своей программе вызов функции CODllRegisterServer из своей задачи выдает ошибку 0x80070005 "Отказано в доступе" Системная утилита Regsvr32 регистрирует COM-объекты только когда запущена под администратором системы. Думаю, для регистрации новых COM-объектов не хватает каких-то привилегий


Очевидно админских прав не хватает, в реестр писать оно не может (HKLM)
Да, можно регистрировать только для пользователя, тогда админские права не нужны.

regsvr32 /i:user name.dll

Но вообще это нехорошо (самостоятельно регистрировать DLL).
По-нормальному это должна быть работа инсталлятора.

Да, а что такое "CODllRegisterServer"? Гугл дает 0 результатов поиска
Re[2]: Регистрация COM-объекта из своей программы
От: Melamed Россия  
Дата: 20.07.23 10:13
Оценка:
Здравствуйте, bnk, Вы писали:

bnk>Здравствуйте, Melamed, Вы писали:


M>>При регистрации СОМ объекта в своей программе вызов функции CODllRegisterServer из своей задачи выдает ошибку 0x80070005 "Отказано в доступе" Системная утилита Regsvr32 регистрирует COM-объекты только когда запущена под администратором системы. Думаю, для регистрации новых COM-объектов не хватает каких-то привилегий


bnk>Очевидно админских прав не хватает, в реестр писать оно не может (HKLM)

bnk>Да, можно регистрировать только для пользователя, тогда админские права не нужны.

bnk>regsvr32 /i:user name.dll


bnk>Но вообще это нехорошо (самостоятельно регистрировать DLL).

А как же программы с частично открытой архитектурой. Когда программе можно писать расширения. Например, модули расширения Microsoft Office представляют собой COM-объект и я не помню, что я его регистрировал с помощью RegSvr32, а просто регистрировал в программе
bnk>По-нормальному это должна быть работа инсталлятора.
Предлагаешь, написать все 50-60 COM-объектов, сразу, когда пользователь может уже работать с 5 СOM-объектами.
bnk>Да, а что такое "CODllRegisterServer"? Гугл дает 0 результатов поиска
Извините описался. Конечно DllRegisterServer

Запреты в программировании — дело условное. Если ты понимаешь, к чему он может привести, то можешь его нарушать, но на твоей ответственности нормальная работа системы. Если ты не понимаешь, к чему приведет нарушение данного запрета, то он не до конца понимает данный механизм операционной системы
Re[3]: Регистрация COM-объекта из своей программы
От: bnk СССР http://unmanagedvisio.com/
Дата: 20.07.23 10:42
Оценка:
Здравствуйте, Melamed, Вы писали:

bnk>>Но вообще это нехорошо (самостоятельно регистрировать DLL).

M>А как же программы с частично открытой архитектурой. Когда программе можно писать расширения. Например, модули расширения Microsoft Office представляют собой COM-объект и я не помню, что я его регистрировал с помощью RegSvr32, а просто регистрировал в программе

Не понял. Программы с частично открытой архитектурой вообще не обязаны использовать COM, насколько я понимаю.
Я же не говорю что нельзя зарегистрировать программно (тот же regsvr32 это как-то делает), скорее о том, что лучше регистрировать с помощью инсталлятора. И де-регистрировать аналогично.
Еще, не обязательно же регистрировать дергая DllRegisterServer, можно напрямую записать в реестр все что требуется.

bnk>>По-нормальному это должна быть работа инсталлятора.

M>Предлагаешь, написать все 50-60 COM-объектов, сразу, когда пользователь может уже работать с 5 СOM-объектами.

Тоже не понял. Какая разница сколько там объектов.
Когда устанавливается программа, ее установщик регистрирует все что нужно. Сколько нужно столько и регистрирует, хоть 5 хоть 50.

bnk>>Да, а что такое "CODllRegisterServer"? Гугл дает 0 результатов поиска

M>Извините описался. Конечно DllRegisterServer

Если нужно зарегистрировать только для текущего пользователя (HKCU), т.е. вызвать "regsvr32 /i: user name.dll", и name.dll это поддерживает, можно попробовать DllInstall(TRUE, "user") вместо DllRegisterServer

M>Запреты в программировании — дело условное. Если ты понимаешь, к чему он может привести, то можешь его нарушать, но на твоей ответственности нормальная работа системы.

M>Если ты не понимаешь, к чему приведет нарушение данного запрета, то он не до конца понимает данный механизм операционной системы

Ну да, классика кун-фу
Re[4]: Регистрация COM-объекта из своей программы
От: Melamed Россия  
Дата: 20.07.23 12:02
Оценка:
Здравствуйте, bnk, Вы писали:

bnk>Здравствуйте, Melamed, Вы писали:


bnk>>>Но вообще это нехорошо (самостоятельно регистрировать DLL).

M>>А как же программы с частично открытой архитектурой. Когда программе можно писать расширения. Например, модули расширения Microsoft Office представляют собой COM-объект и я не помню, что я его регистрировал с помощью RegSvr32, а просто регистрировал в программе

bnk>Не понял. Программы с частично открытой архитектурой вообще не обязаны использовать COM, насколько я понимаю.

bnk>Я же не говорю что нельзя зарегистрировать программно (тот же regsvr32 это как-то делает), скорее о том, что лучше регистрировать с помощью инсталлятора. И де-регистрировать аналогично.
bnk>Еще, не обязательно же регистрировать дергая DllRegisterServer, можно напрямую записать в реестр все что требуется.
Как я понял из статьи Использование ATL Registrar функция DllRegisterServer кроме что вносить регистрационную запись о регистрируемом COM-объекте в ветвь реестра HKCR, ничего не делает. Значит, ограничение прав на запись в этот раздел реестра.
И кроме этого, программа-регистратор ничего не знает о регистрируемом COM-oбекте, кроме динамической библиотеки, в которой он реализован.

bnk>>>По-нормальному это должна быть работа инсталлятора.

M>>Предлагаешь, написать все 50-60 COM-объектов, сразу, когда пользователь может уже работать с 5 СOM-объектами.

bnk>Тоже не понял. Какая разница сколько там объектов.

bnk>Когда устанавливается программа, ее установщик регистрирует все что нужно. Сколько нужно столько и регистрирует, хоть 5 хоть 50.

bnk>Если нужно зарегистрировать только для текущего пользователя (HKCU), т.е. вызвать "regsvr32 /i: user name.dll", и name.dll это поддерживает, можно попробовать DllInstall(TRUE, "user") вместо DllRegisterServer

Идея хорошая. Надо попробовать

M>>Запреты в программировании — дело условное. Если ты понимаешь, к чему он может привести, то можешь его нарушать, но на твоей ответственности нормальная работа системы.

M>>Если ты не понимаешь, к чему приведет нарушение данного запрета, то он не до конца понимает данный механизм операционной системы

bnk>Ну да, классика кун-фу
Re[5]: Регистрация COM-объекта из своей программы
От: m2user  
Дата: 20.07.23 13:00
Оценка: 1 (1) +1
M>Как я понял из статьи Использование ATL Registrar функция DllRegisterServer кроме что вносить регистрационную запись о регистрируемом COM-объекте в ветвь реестра HKCR, ничего не делает. Значит, ограничение прав на запись в этот раздел реестра.
M>И кроме этого, программа-регистратор ничего не знает о регистрируемом COM-oбекте, кроме динамической библиотеки, в которой он реализован.

Можно и без записей в реестре, если используется Registration-free COM component.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.