Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
 Перестал работать используемый COM-ShellExtension: Класс не зарегистрирован, ClassID {...}  [new]
Молотоглав
Guest
Всем привет!
Есть в ОС один DLL-COM-Сервер-ShellExtension. И однажды он перестал работать - фик знает почему, сам (ну или может авто-обновление какое само подкачалось молча).
А я его в коде Делфи использую. Примерно так:
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, в реестре всё вроде как и нужно.

Делал так:
C:\Windows\System32\regsvr32.exe "C:\...\ShellExtension.dll"
Пишет мол "Успешное выполнение DllRegisterServer", но проблема не ушла. На всякий случай от балды сделал и так тоже:
C:\Windows\SysWOW64\regsvr32.exe "C:\...\ShellExtension.dll"
Снова пишет мол "Успешное выполнение DllRegisterServer" (почему кстати? она же x64), но проблема не ушла.

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

Спасибо!
10 июн 18, 02:57    [21483096]     Ответить | Цитировать Сообщить модератору
 Re: Перестал работать используемый COM-ShellExtension: Класс не зарегистрирован, ClassID {...}  [new]
Молотоглав
Guest
Нашёл это: http://www.sql.ru/forum/1273165/createcomobject-i-fabrika-klassa

И вот это:
Ben Voigt
Shell 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.
User453465436754
That'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
Mamadex
You can use a 32-bit explorer, like xplorer2 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 июн 18, 14:26    [21485972]     Ответить | Цитировать Сообщить модератору
 Re: Перестал работать используемый COM-ShellExtension: Класс не зарегистрирован, ClassID {...}  [new]
Молотоглав
Guest
Вроде теперь понятно: любые "dll" - это "in-process" (в реестре обозначается как InprocServer32), и тут разрядность важна. Разрядность не важна в "out-of-process" (в реестре обозначается как LocalServer32), которые исключительно в виде "exe".
Так что сейчас у меня ничего не работает потому что разная разрядность у моей программы и у dll.

Но осталось непонятным - дак раньше-то работало! Почему? Раньше dll была 32-bit, и почему-то вдруг стала 64-bit? Или раньше были обе версии dll, а сейчас 32-bit версия пропала?
Как вообще регистрируются в 64-bit'ной системе две версии одного и того же ShellExtension? Как COM находит нужную? И у них один GUID или как?
18 июн 18, 17:14    [21500624]     Ответить | Цитировать Сообщить модератору
 Re: Перестал работать используемый COM-ShellExtension: Класс не зарегистрирован, ClassID {...}  [new]
kealon(Ruslan)
Member

Откуда: Нижневартовск
Сообщений: 3617
Молотоглав,

File redirect не менял?
18 июн 18, 17:17    [21500642]     Ответить | Цитировать Сообщить модератору
 Re: Перестал работать используемый COM-ShellExtension: Класс не зарегистрирован, ClassID {...}  [new]
kealon(Ruslan)
Member

Откуда: Нижневартовск
Сообщений: 3617
Молотоглав
А как вообще организуются подобные COM на x64? Должно стоять обе версии и x86 и x64? А если достаточно одной - какая лучше и регистрировать из под System32 или SysWOW64? Или и там и там? Пользуются-то им и такие и такие процессы.

Спасибо!
https://www.codeproject.com/Articles/441/The-Complete-Idiot-s-Guide-to-Writing-Shell-Extens
18 июн 18, 17:20    [21500647]     Ответить | Цитировать Сообщить модератору
 Re: Перестал работать используемый COM-ShellExtension: Класс не зарегистрирован, ClassID {...}  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 10652
Молотоглав
Как 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 июн 18, 17:57    [21500772]     Ответить | Цитировать Сообщить модератору
 Re: Перестал работать используемый COM-ShellExtension: Класс не зарегистрирован, ClassID {...}  [new]
Молотоглав
Guest
Спасибо большое! Будем читать/смотреть!

Ещё такой подвопрос... А как корректно проверить зарегистрирован CLSID или нет? В интернете мнения разнятся.
Ну например я на данный момент делаю CreateComObject() - и получаю исключение. В теории можно и так узнавать.
Кто-то говорит мол надо читать реестр. А кто-то добавляет что даже если в реестре есть, то ещё неплохо бы ещё убедиться что сам соответствующий файл dll/exe не пропал.
Но каждый раз читать реестр? А если это может требоваться часто? Я ожидал что будет функция, но таковая что-то не нагуглилась...
19 июн 18, 14:13    [21503264]     Ответить | Цитировать Сообщить модератору
 Re: Перестал работать используемый COM-ShellExtension: Класс не зарегистрирован, ClassID {...}  [new]
ma1tus
Member

Откуда:
Сообщений: 602
Молотоглав
Но каждый раз читать реестр? А если это может требоваться часто? Я ожидал что будет функция, но ...
ClassIDToProgID, понятно - не предлагать...
https://msdn.microsoft.com/en-us/library/windows/desktop/ms690567(v=vs.85).aspx
ProgIDFromCLSID uses entries in the registry to
19 июн 18, 15:20    [21503631]     Ответить | Цитировать Сообщить модератору
 Re: Перестал работать используемый COM-ShellExtension: Класс не зарегистрирован, ClassID {...}  [new]
Молотоглав
Guest
Отчего же... :3
Когда гуглил, находил писали про CLSIDFromProgID() и CLSIDFromString() и ещё чё-то, но они не подходили - потому что у целевого COM-класса нету оных обозначений.
А вот ProgIDFromCLSID() можно попробовать, спасибо!
21 июн 18, 16:31    [21510207]     Ответить | Цитировать Сообщить модератору
Все форумы / Delphi Ответить