Расширение элемента ContextMenu не работает в Windows 7 - PullRequest
1 голос
/ 14 января 2012

Мое программное обеспечение работает как расширение оболочки и регистрируется для отображения в контекстном меню Справочная информация / Каталог и на рабочем столе.Я работаю на Win XP, и она работает хорошо, но теперь, когда я тестирую ее на Windows 7, она не хочет работать хорошо.Элемент контекста существует только в меню правой кнопки мыши на рабочем столе, но отсутствует в фоновом режиме / каталоге.Нужна помощь!

Вот функция reg в Delphi, но примеры на любом языке приняты, я могу показать расширение DLL src, если необходимо!

const
  CLSID_ContextMenu = '{AB69D961-B907-11D0-B8FA-A85800C10000}';

procedure TForm1.Button1Click(Sender: TObject);
var
  Reg: TRegistry;
begin
  Reg := TRegistry.Create;
  try
    with Reg do
    begin
      RootKey := HKEY_CLASSES_ROOT;
      OpenKey('\CLSID\' + CLSID_ContextMenu, True);
      WriteString('', 'Context Menu Shell Extension');
      OpenKey('\CLSID\' + CLSID_ContextMenu + '\InProcServer32', True);
      WriteString('', ExtractFilePath(Application.ExeName) + '\Project1.dll');
      WriteString('ThreadingModel', 'Apartment');
      CreateKey('\Directory\Background\ShellEx\ContextMenuHandlers\' + CLSID_ContextMenu);
    end;
  finally
    Reg.Free;
  end;
end;

Ответы [ 2 ]

2 голосов
/ 14 января 2012

Вы делаете некоторые серьезные ошибки при использовании TRegistry.

Вы не указываете никаких прав Access, поэтому по умолчанию используется KEY_ALL_ACCESS, что разрешено только администраторам.Администраторы в Vista и более поздних версиях не имеют полных прав администратора, как в XP.Убедитесь, что ваше приложение работает в повышенном состоянии, если включен контроль учетных записей.Либо щелкните правой кнопкой мыши по файлу .exe и выберите «Запуск от имени администратора», либо присвойте вашему .exe манифест UAC, в котором указано «requiredExecutionLevel = requireAdministrator».Если вы не хотите, чтобы ваше основное приложение запускалось с повышенными правами, переместите логику реестра в отдельный объект .exe или COM, который затем можно будет запускать с повышенными правами.

Вы пишете в HKEY_CLASSES_ROOT.Не делай этого.MSDN говорит так же.Вы можете читать из него, но не писать в него.Вместо этого вам нужно указать либо HKEY_CURRENT_USER\Software\Classes, либо HKEY_LOCAL_MACHINE\Software\Classes, в зависимости от того, нужно ли зарегистрировать расширение оболочки для текущего пользователя или всех пользователей.

Вы игнорируете возвращаемое значение OpenKey() иCreateKey() чтобы убедиться, что ключи открыты / созданы успешно, прежде чем писать в них.

0 голосов
/ 14 января 2012

Я нашел это! В XP я написал

\Directory\Background\Shell**Ex**\**ContextMenuHandlers**\CLSID

но в Windows 7 путь должен выглядеть как

\Directory\Background\Shell\Name of your app\command

и в команде мы указываем путь к нашему приложению в двойных кавычках "% path%".:)

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