Почему я не могу зарегистрировать свои COM DLL? - PullRequest
2 голосов
/ 22 января 2010

Моему приложению нужно зарегистрировать две COM-библиотеки. Это делается автоматически, если у пользователя есть необходимые права доступа, но в противном случае это можно сделать с помощью regsvr32.

Теперь на нескольких рабочих станциях происходит следующее:

  1. Запуск cmd.exe с правами администратора
  2. Зарегистрировать первую DLL: Успешно
  3. Зарегистрировать вторую DLL: ошибка (0x80004005, доступ запрещен)

Когда мне впервые сообщили об этой ошибке, я автоматически ответил: «Конечно, это не работает, вам нужны права администратора». Само собой разумеется, я чувствовал себя довольно смущенным, поскольку я попытался зарегистрировать DLL самостоятельно ...

Что может быть причиной этого: одну DLL можно зарегистрировать, а другую - нет.

Некоторая справочная информация:

  • Обе библиотеки DLL созданы в Delphi 2005.
  • Обе библиотеки DLL имеют очень простые интерфейсы и очень мало классов.
  • Отказавшие машины всегда были Vista или Windows 7.

Обычно я запускаю Process Monitor, но сейчас у меня нет доступа к одной из рабочих станций, поэтому мне нужно собрать как можно больше информации, пока я не смогу достать одну из них.

ОБНОВЛЕНИЕ : я получил удаленный доступ к одной из неисправных рабочих станций. Загадочные вещи произошли:

  • Запуск Process Monitor был невозможен (!) Через несколько секунд Windows показала ошибку «недостаточно памяти».
  • Переключение на другого пользователя позволило зарегистрировать DLL. (!)

Другими словами:

  • Войдите в систему как UserA, запустите cmd.exe как Администратор, regsvr32.exe: Ошибка
  • Войдите в систему как UserB, запустите cmd.exe как Администратор, regsvr32.exe: Успешно

Что может вводить такое поведение?!

1 Ответ

3 голосов
/ 22 января 2010

Несколько вещей, чтобы попробовать и проверить:

  1. Запустите Process Explorer на компьютере, на котором обе DLL успешно зарегистрируются, и проведите быстрое сравнение ключей reg и местоположений файлов, к которым прикасаются обе DLL. Может быть какая-то разница, которая объясняет это поведение
  2. Это всегда одна и та же DLL, которая терпит неудачу? Что произойдет, если вы измените порядок регистрации? Возможно, что первое влияет на второе (например, путем установки ACL на ключ reg)
  3. Может быть интересно собрать некоторую статистику о том, является ли это 32-битной или 64-битной проблемой. Существуют определенные особенности поведения HKCU и HKLM в 64-битной Vista и Win7, что может повлиять на регистрацию.
  4. Спросите пользователей, которые столкнулись с этой проблемой, пытались ли они зарегистрироваться как обычный пользователь, прежде чем делать это в качестве администратора. В этом случае виртуализация HKLM может сыграть плохую роль.

Обновление

Судя по вашему комментарию, похоже, что неудачная попытка регистрации обычного пользователя приводит машину в неработоспособное состояние. Это может быть либо в HKCU\Software\Classes (отображение HKCR для каждого пользователя), либо в HKCR\VirtualStore\MACHINE\SOFTWARE (виртуализированный HKLM). Вам необходимо точно определить, что остается в реестре при неудачной попытке регистрации.

Я бы запустил Process Explorer на чистой машине и попытался сделать снимок без регистрации.

Кроме того, попробуйте привести машину в такое состояние, а затем запустите незарегистрированную отмену регистрации. В идеальном случае это должно «починить» машину. Если это работает, у вас есть быстрый обходной путь, который вы можете дать своим пользователям, пока вы работаете над правильным исправлением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...