Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Перестал работать используемый COM-ShellExtension: Класс не зарегистрирован, ClassID {...} / 9 сообщений из 9, страница 1 из 1
10.06.2018, 02:57
    #39659170
Перестал работать используемый COM-ShellExtension: Класс не зарегистрирован, ClassID {...}
Всем привет!
Есть в ОС один DLL-COM-Сервер-ShellExtension. И однажды он перестал работать - фик знает почему, сам ( ну или может авто-обновление какое само подкачалось молча ).
А я его в коде Делфи использую. Примерно так:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
var ComObj: IInterface; Ret: HRESULT;
begin
ComObj:=CreateComObject(ShellExtensionGUID);
Ret:=ComObj.QueryInterface(IID_ISOMEINTERFACE_A, VAR_A);
If Not Succeeded(Ret) Then
      ShowMessage('VAR_A: '+SysErrorMessage(Ret));
Ret:=ComObj.QueryInterface(IID_ISOMEINTERFACE_B, VAR_B);
If Not Succeeded(Ret) Then
      ShowMessage('VAR_B: '+SysErrorMessage(Ret));
// Пользуюсь VAR_A и VAR_B...

И оно вылетает ещё до моих ShowMessage - с сообщением " Класс не зарегистрирован, ClassID: {...ShellExtensionGUID...}. ".
У меня 32-bit приложение, а библиотека 64-bit - может ли быть из-за этого? Windows 10 x64, в реестре всё вроде как и нужно.

Делал так:
Код: powershell
1.
C:\Windows\System32\regsvr32.exe "C:\...\ShellExtension.dll"

Пишет мол " Успешное выполнение DllRegisterServer ", но проблема не ушла. На всякий случай от балды сделал и так тоже:
Код: powershell
1.
C:\Windows\SysWOW64\regsvr32.exe "C:\...\ShellExtension.dll"

Снова пишет мол " Успешное выполнение DllRegisterServer " (почему кстати? она же x64), но проблема не ушла.

В самой Shell оно тоже не работает. Программа-менеджер ShellExView его видит, и определяет как "включено". Выключать и обратно включать пробовал - без результатов.
А как вообще организуются подобные COM на x64? Должно стоять обе версии и x86 и x64? А если достаточно одной - какая лучше и регистрировать из под System32 или SysWOW64? Или и там и там? Пользуются-то им и такие и такие процессы.

Спасибо!
...
Рейтинг: 0 / 0
12.06.2018, 14:26
    #39659704
Перестал работать используемый COM-ShellExtension: Класс не зарегистрирован, ClassID {...}
Нашёл это: 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.
гм...
...
Рейтинг: 0 / 0
18.06.2018, 17:14
    #39662087
Перестал работать используемый COM-ShellExtension: Класс не зарегистрирован, ClassID {...}
Вроде теперь понятно: любые "dll" - это "in-process" (в реестре обозначается как InprocServer32), и тут разрядность важна. Разрядность не важна в "out-of-process" (в реестре обозначается как LocalServer32), которые исключительно в виде "exe".
Так что сейчас у меня ничего не работает потому что разная разрядность у моей программы и у dll.

Но осталось непонятным - дак раньше-то работало! Почему? Раньше dll была 32-bit, и почему-то вдруг стала 64-bit? Или раньше были обе версии dll, а сейчас 32-bit версия пропала?
Как вообще регистрируются в 64-bit'ной системе две версии одного и того же ShellExtension? Как COM находит нужную? И у них один GUID или как?
...
Рейтинг: 0 / 0
18.06.2018, 17:17
    #39662090
kealon(Ruslan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перестал работать используемый COM-ShellExtension: Класс не зарегистрирован, ClassID {...}
Молотоглав,

File redirect не менял?
...
Рейтинг: 0 / 0
18.06.2018, 17:20
    #39662091
kealon(Ruslan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перестал работать используемый COM-ShellExtension: Класс не зарегистрирован, ClassID {...}
МолотоглавА как вообще организуются подобные COM на x64? Должно стоять обе версии и x86 и x64? А если достаточно одной - какая лучше и регистрировать из под System32 или SysWOW64? Или и там и там? Пользуются-то им и такие и такие процессы.

Спасибо! https://www.codeproject.com/Articles/441/The-Complete-Idiot-s-Guide-to-Writing-Shell-Extens
...
Рейтинг: 0 / 0
18.06.2018, 17:57
    #39662107
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перестал работать используемый COM-ShellExtension: Класс не зарегистрирован, ClassID {...}
МолотоглавКак 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, скорее всего алгоритм немного другой
...
Рейтинг: 0 / 0
19.06.2018, 14:13
    #39662477
Перестал работать используемый COM-ShellExtension: Класс не зарегистрирован, ClassID {...}
Спасибо большое! Будем читать/смотреть!

Ещё такой подвопрос... А как корректно проверить зарегистрирован CLSID или нет? В интернете мнения разнятся.
Ну например я на данный момент делаю CreateComObject() - и получаю исключение. В теории можно и так узнавать.
Кто-то говорит мол надо читать реестр. А кто-то добавляет что даже если в реестре есть, то ещё неплохо бы ещё убедиться что сам соответствующий файл dll/exe не пропал.
Но каждый раз читать реестр? А если это может требоваться часто? Я ожидал что будет функция, но таковая что-то не нагуглилась...
...
Рейтинг: 0 / 0
19.06.2018, 15:20
    #39662524
ma1tus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перестал работать используемый COM-ShellExtension: Класс не зарегистрирован, ClassID {...}
Молотоглав Но каждый раз читать реестр? А если это может требоваться часто? Я ожидал что будет функция, но ... ClassIDToProgID, понятно - не предлагать... https://msdn.microsoft.com/en-us/library/windows/desktop/ms690567(v=vs.85).aspx ProgIDFromCLSID uses entries in the registry to
...
Рейтинг: 0 / 0
21.06.2018, 16:31
    #39663714
Перестал работать используемый COM-ShellExtension: Класс не зарегистрирован, ClassID {...}
Отчего же... :3
Когда гуглил, находил писали про CLSIDFromProgID() и CLSIDFromString() и ещё чё-то, но они не подходили - потому что у целевого COM-класса нету оных обозначений.
А вот ProgIDFromCLSID() можно попробовать, спасибо!
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Перестал работать используемый COM-ShellExtension: Класс не зарегистрирован, ClassID {...} / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]