|
|
|
Перестал работать используемый COM-ShellExtension: Класс не зарегистрирован, ClassID {...}
|
|||
|---|---|---|---|
|
#18+
Всем привет! Есть в ОС один DLL-COM-Сервер-ShellExtension. И однажды он перестал работать - фик знает почему, сам ( ну или может авто-обновление какое само подкачалось молча ). А я его в коде Делфи использую. Примерно так: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. И оно вылетает ещё до моих ShowMessage - с сообщением " Класс не зарегистрирован, ClassID: {...ShellExtensionGUID...}. ". У меня 32-bit приложение, а библиотека 64-bit - может ли быть из-за этого? Windows 10 x64, в реестре всё вроде как и нужно. Делал так: Код: powershell 1. Пишет мол " Успешное выполнение DllRegisterServer ", но проблема не ушла. На всякий случай от балды сделал и так тоже: Код: powershell 1. Снова пишет мол " Успешное выполнение DllRegisterServer " (почему кстати? она же x64), но проблема не ушла. В самой Shell оно тоже не работает. Программа-менеджер ShellExView его видит, и определяет как "включено". Выключать и обратно включать пробовал - без результатов. А как вообще организуются подобные COM на x64? Должно стоять обе версии и x86 и x64? А если достаточно одной - какая лучше и регистрировать из под System32 или SysWOW64? Или и там и там? Пользуются-то им и такие и такие процессы. Спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2018, 02:57 |
|
||
|
Перестал работать используемый COM-ShellExtension: Класс не зарегистрирован, ClassID {...}
|
|||
|---|---|---|---|
|
#18+
Нашёл это: http://www.sql.ru/forum/1273165/createcomobject-i-fabrika-klassa И вот это: Ben VoigtShell extensions are COM components. If you install it as an out-of-process server, Windows (DCOM) should take care of all the 32 <-> 64-bit marshalling .User453465436754That's incorrect. Content menu handlers are in-process extensions and cannot be implemented as out-of-process. https://msdn.microsoft.com/en-us/library/windows/desktop/dd758089(v=vs.85).aspx MamadexYou can use a 32-bit explorer, like xplorer 2 in 64-bit Windows. They can handle 32-bit DLL extensions which may use for as searching content, preview data and those also display in context menu. The built-in explorer is 64-bit, which ignores 32-bit extensions. гм... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.06.2018, 14:26 |
|
||
|
Перестал работать используемый COM-ShellExtension: Класс не зарегистрирован, ClassID {...}
|
|||
|---|---|---|---|
|
#18+
Вроде теперь понятно: любые "dll" - это "in-process" (в реестре обозначается как InprocServer32), и тут разрядность важна. Разрядность не важна в "out-of-process" (в реестре обозначается как LocalServer32), которые исключительно в виде "exe". Так что сейчас у меня ничего не работает потому что разная разрядность у моей программы и у dll. Но осталось непонятным - дак раньше-то работало! Почему? Раньше dll была 32-bit, и почему-то вдруг стала 64-bit? Или раньше были обе версии dll, а сейчас 32-bit версия пропала? Как вообще регистрируются в 64-bit'ной системе две версии одного и того же ShellExtension? Как COM находит нужную? И у них один GUID или как? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.06.2018, 17:14 |
|
||
|
Перестал работать используемый COM-ShellExtension: Класс не зарегистрирован, ClassID {...}
|
|||
|---|---|---|---|
|
#18+
Молотоглав, File redirect не менял? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.06.2018, 17:17 |
|
||
|
Перестал работать используемый COM-ShellExtension: Класс не зарегистрирован, ClassID {...}
|
|||
|---|---|---|---|
|
#18+
МолотоглавА как вообще организуются подобные COM на x64? Должно стоять обе версии и x86 и x64? А если достаточно одной - какая лучше и регистрировать из под System32 или SysWOW64? Или и там и там? Пользуются-то им и такие и такие процессы. Спасибо! https://www.codeproject.com/Articles/441/The-Complete-Idiot-s-Guide-to-Writing-Shell-Extens ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.06.2018, 17:20 |
|
||
|
Перестал работать используемый COM-ShellExtension: Класс не зарегистрирован, ClassID {...}
|
|||
|---|---|---|---|
|
#18+
МолотоглавКак COM находит нужную?64 битные СОМ объекты регистрируются в ветке HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID 32 битные в ветке HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Classes\CLSID В зависимости от того обращается ли 32-битное приложение или 64 битное ветка HKEY_LOCAL_MACHINE\SOFTWARE\Classes или HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Classes подключается в HKEY_CLASSES_ROOT. Таким образом в HKEY_CLASSES_ROOT\CLSID всегда будет записан GUID, соответствующей текущей разрядности процесса Молотоглаву них один GUID или как?Не принципиально. Обычно один P.S. Но это все для In-Process. Для Out-Process, скорее всего алгоритм немного другой ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.06.2018, 17:57 |
|
||
|
Перестал работать используемый COM-ShellExtension: Класс не зарегистрирован, ClassID {...}
|
|||
|---|---|---|---|
|
#18+
Спасибо большое! Будем читать/смотреть! Ещё такой подвопрос... А как корректно проверить зарегистрирован CLSID или нет? В интернете мнения разнятся. Ну например я на данный момент делаю CreateComObject() - и получаю исключение. В теории можно и так узнавать. Кто-то говорит мол надо читать реестр. А кто-то добавляет что даже если в реестре есть, то ещё неплохо бы ещё убедиться что сам соответствующий файл dll/exe не пропал. Но каждый раз читать реестр? А если это может требоваться часто? Я ожидал что будет функция, но таковая что-то не нагуглилась... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2018, 14:13 |
|
||
|
Перестал работать используемый COM-ShellExtension: Класс не зарегистрирован, ClassID {...}
|
|||
|---|---|---|---|
|
#18+
Молотоглав Но каждый раз читать реестр? А если это может требоваться часто? Я ожидал что будет функция, но ... ClassIDToProgID, понятно - не предлагать... https://msdn.microsoft.com/en-us/library/windows/desktop/ms690567(v=vs.85).aspx ProgIDFromCLSID uses entries in the registry to ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2018, 15:20 |
|
||
|
Перестал работать используемый COM-ShellExtension: Класс не зарегистрирован, ClassID {...}
|
|||
|---|---|---|---|
|
#18+
Отчего же... :3 Когда гуглил, находил писали про CLSIDFromProgID() и CLSIDFromString() и ещё чё-то, но они не подходили - потому что у целевого COM-класса нету оных обозначений. А вот ProgIDFromCLSID() можно попробовать, спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.06.2018, 16:31 |
|
||
|
|

start [/forum/topic.php?desktop=1&fid=58&tid=2040715]: |
0ms |
get settings: |
8ms |
get forum list: |
23ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
162ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
40ms |
get tp. blocked users: |
1ms |
| others: | 202ms |
| total: | 454ms |

| 0 / 0 |
