Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > ОС и железо
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 29.06.2013, 23:22
Aniskin Aniskin вне форума
Прохожий
 
Регистрация: 29.06.2013
Сообщения: 9
Версия Delphi: 7 - XE4
Репутация: 10
По умолчанию Shell Ace - библиотека для создания расширений оболочки Windows

Прошу сообщество потестирвать мою библиотеку Shell Ace. Как сказано в описании темы, библиотека позволяет создавать в среде разработки Delphi расширения оболочки Windows. Поддерживаются версии Delphi начиная с 7 и заканчивая XE4. В библиотеку входит расширение IDE, которое интегрируется в окно, появляющееся при выборе команды File/New/Other, оно позволяет создавать каркасы расширений.

Для создания нового расширения нужно выбрать на вкладке Windows Shell Extension значек Windows Shell Extension, это приведет к созданию нового проекта расширения. После этого нужно выбрать на той же вкладке необходимый обработчик, например Context menu handler


Появится диалог создания обработчика:


Можно выбрать имя класса и дополнительные методы обработчика, которые будут прописаны в коде. После нажатия на кнопку OK в проект будет добавлен новый модуль. Если при этом была отмечена опция Create sample, то в код модуля будет прописан образец обработки информации.

Процесс разработки расширения сводится к перекрытию различных методов базового класса расширения, в перекрытых методах реализуется нужная функциональность. После написания расширения его нужно регистрировать стандартным образом с помощью утилиты regsvr32.exe из состава Windows. Регистрацию можно произвести и с помощью расширения оболочки RegExtension, входящим в состав Shell Ace. После его регистрации в системе при вызове (с нажатой клавишей Shift) контекстного меню dll-файлов в них можно увидеть две дополнительные команды:


В системах начиная с Windows Vista RegExtension сама запросит при необходимости повышение привилегий, необходимых для регистрации расширения оболочки.

Библиотека написана с учетом специфики последних версий Windows (например, реализована поддержка методов инициализации IInitilizateWith*, реализована работа с 32-ми иконками в контекстных меню и т.д.).

Скачать библиотеку можно по ссылке http://shellace.com/ShellAceSetup.exe. Исполняемый файл является установщиком, он сам пропишет все пути в Delphi и зарегистрирует расширение IDE.

К сожалению, полноценная справка еще не готова. Но я с удовольствием отвечу на любые вопросы и приму любые пожелания.
Ответить с цитированием
Этот пользователь сказал Спасибо Aniskin за это полезное сообщение:
M.A.D.M.A.N. (30.06.2013)
  #2  
Старый 24.07.2013, 12:13
Zorkov Igor Zorkov Igor вне форума
Новичок
 
Регистрация: 28.07.2009
Сообщения: 85
Репутация: 50
По умолчанию

Можно пример поподробней для ContextMenu, например регистрация для рашрирения .exe
Ответить с цитированием
  #3  
Старый 24.07.2013, 13:19
Aniskin Aniskin вне форума
Прохожий
 
Регистрация: 29.06.2013
Сообщения: 9
Версия Delphi: 7 - XE4
Репутация: 10
По умолчанию

Цитата:
Сообщение от Zorkov Igor
Можно пример поподробней для ContextMenu, например регистрация для рашрирения .exe

Та версия библиотеки, которая выложена на сайте, устарела. Сегодня вечером выложу обновленную версию.

Сначала прочитайте небольшой мануал по созданию расширений оболочки ContextMenu.

Конкретно для exe файлов нужно в методе FillProgIDList добавлять в список строку ".exe" или "exefile". Остальное смотрите в генерируемом библиотекой примере. Если будут еще вопросы - задавайте.

Цитата:
Сообщение от M.A.D.M.A.N.
И исходники даже не продаются?
Я обдумаю. Есть реальный интерес?

Последний раз редактировалось M.A.D.M.A.N., 24.07.2013 в 14:59. Причина: Мерж
Ответить с цитированием
Этот пользователь сказал Спасибо Aniskin за это полезное сообщение:
Zorkov Igor (24.07.2013)
  #4  
Старый 24.07.2013, 13:57
Zorkov Igor Zorkov Igor вне форума
Новичок
 
Регистрация: 28.07.2009
Сообщения: 85
Репутация: 50
По умолчанию

Цитата:
Сообщение от Aniskin
Та версия библиотеки, которая выложена на сайте, устарела. Сегодня вечером выложу обновленную версию.

Отпишитесь здесь плз когда выложите, помучаю вечером

Спасибо
Ответить с цитированием
  #5  
Старый 24.07.2013, 20:13
Aniskin Aniskin вне форума
Прохожий
 
Регистрация: 29.06.2013
Сообщения: 9
Версия Delphi: 7 - XE4
Репутация: 10
По умолчанию

Цитата:
Сообщение от Zorkov Igor
Отпишитесь здесь плз когда выложите
Отписываюсь.
Ответить с цитированием
Этот пользователь сказал Спасибо Aniskin за это полезное сообщение:
Zorkov Igor (24.07.2013)
  #6  
Старый 26.07.2013, 10:36
Zorkov Igor Zorkov Igor вне форума
Новичок
 
Регистрация: 28.07.2009
Сообщения: 85
Репутация: 50
По умолчанию

Шикарно вообще

Радует инсталер

Все получилось с контекст меню, регистрирую DLL как то так

Код:
const
  CLSID_ContextMenu = '{BBAB3AF5-43D9-4C12-BC92-32CF83868822}';

function RegExt(FileName: String): Boolean;
var
  Reg: TRegistry;
begin
  try
    Result := False;
    
      Reg := TRegistry.Create;
      try
        with Reg do
        begin
          RootKey := HKEY_CLASSES_ROOT;
          OpenKey('\CLSID\' + CLSID_ContextMenu, True);
          WriteString('', 'File Unlocker');
          OpenKey('\CLSID\' + CLSID_ContextMenu + '\InProcServer32', True);
          WriteString('', FileName);
          WriteString('ThreadingModel', 'Apartment');

          Result := OpenKey('\*\shellex\ContextMenuHandlers\' + CLSID_ContextMenu, True);
          if Result then
          begin
            WriteString('', CLSID_ContextMenu);
            Result := OpenKey('\folder\shellex\ContextMenuHandlers\' + CLSID_ContextMenu, True);
            WriteString('', CLSID_ContextMenu);
          end;

          Result := OpenKey('\lnkfile\shellex\ContextMenuHandlers\' + CLSID_ContextMenu, True);
          WriteString('', CLSID_ContextMenu);
        end;
      finally
        Reg.Free;
      end;
  
  except
  end;
end;

function UnRegExt(FileName: String): Boolean;
var
  Reg: TRegistry;
begin
  try
    Result := False;
    
      Reg := TRegistry.Create;
      try
        with Reg do
        begin
          RootKey := HKEY_CLASSES_ROOT;
          Result := DeleteKey('\*\shellex\ContextMenuHandlers\' + CLSID_ContextMenu);
          if Result then
          begin
            Result := DeleteKey('\folder\shellex\ContextMenuHandlers\' + CLSID_ContextMenu);
          end;
          Result := DeleteKey('\lnkfile\shellex\ContextMenuHandlers\' + CLSID_ContextMenu);
        end;
      finally
        Reg.Free;
      end;
    
  except
  end;
end;

Буду теперь доводить до ума File Unlocker, здесь пользовал ShellPlus, но он шибко глючный сволочь
Ответить с цитированием
  #7  
Старый 26.07.2013, 11:13
Aniskin Aniskin вне форума
Прохожий
 
Регистрация: 29.06.2013
Сообщения: 9
Версия Delphi: 7 - XE4
Репутация: 10
По умолчанию

Цитата:
Сообщение от Zorkov Igor
регистрирую DLL как то так
Весь этот код уже выполняется библиотекой при использовании следующего кода:

Код:
class function TContextMenuExtension1.GetDescription: UnicodeString;
begin
  Result := 'File Unlocker';
end;

procedure TContextMenuExtension1.FillProgIDList(AList: TStrings);
begin
  AList.Add('*');
  AList.Add('folder');
  AList.Add('lnkfile');
end;


Цитата:
Сообщение от Zorkov Igor
пользовал ShellPlus, но он шибко глючный сволочь
Согласен Я тоже пытался одно время использовать ShellPlus, даже купил себе эту либу, но очень она мне не понравилась, так, что проще было написать самому с нуля Вот и написал.
Ответить с цитированием
  #8  
Старый 26.07.2013, 11:28
Aniskin Aniskin вне форума
Прохожий
 
Регистрация: 29.06.2013
Сообщения: 9
Версия Delphi: 7 - XE4
Репутация: 10
По умолчанию

Цитата:
Сообщение от M.A.D.M.A.N.
Так что на счет цен? Не только мне было бы интересно узнать, сколько стоит исходный код.
Я пока не готов ответить на этот вопрос.
Ответить с цитированием
  #9  
Старый 26.07.2013, 11:53
Zorkov Igor Zorkov Igor вне форума
Новичок
 
Регистрация: 28.07.2009
Сообщения: 85
Репутация: 50
По умолчанию

Цитата:
Сообщение от Aniskin
Весь этот код уже выполняется библиотекой при использовании следующего кода:

Код:
class function TContextMenuExtension1.GetDescription: UnicodeString;
begin
  Result := 'File Unlocker';
end;

procedure TContextMenuExtension1.FillProgIDList(AList: TStrings);
begin
  AList.Add('*');
  AList.Add('folder');
  AList.Add('lnkfile');
end;

Но при этом надо вызывать regsvr32.exe так?

Мне проще из своей программы в реестр записать
Ответить с цитированием
  #10  
Старый 26.07.2013, 12:01
Aniskin Aniskin вне форума
Прохожий
 
Регистрация: 29.06.2013
Сообщения: 9
Версия Delphi: 7 - XE4
Репутация: 10
По умолчанию

Цитата:
Сообщение от Zorkov Igor
Но при этом надо вызывать regsvr32.exe так?
Можно загрузить dll и вызвать DllRegisterServer или DllUnregisterServer. В целом, я бы рекомендовал бы все же использовать методы регистрации самой библиотеки, потому что могут регистрироваться неявные ключи. Для Context menu это будет ключ MayChangeDefaultMenu. Для других типов расширений будут другие ключи.
Ответить с цитированием
  #11  
Старый 26.07.2013, 12:31
Zorkov Igor Zorkov Igor вне форума
Новичок
 
Регистрация: 28.07.2009
Сообщения: 85
Репутация: 50
По умолчанию

У меня наблюдается такая бабуйня при регистрации на линки

26-07-2013 12-06-54.jpg

То есть два моих пункта меню

Это как то правится?
Ответить с цитированием
  #12  
Старый 26.07.2013, 12:37
Aniskin Aniskin вне форума
Прохожий
 
Регистрация: 29.06.2013
Сообщения: 9
Версия Delphi: 7 - XE4
Репутация: 10
По умолчанию

Цитата:
Сообщение от Zorkov Igor
У меня наблюдается такая бабуйня при регистрации на линки

Вложение 4052

То есть два моих пункта меню

Это как то правится?

Предполагаю, что проблема в том, что ты регистрируешь на "*" и на "lnkfile" одновременно. Хотя "*" уже включает в себя "lnkfile". Если код обработки для "*" и "lnkfile" один, то либо убери "*", либо убери "lnkfile". Если разный, то нужно создавать два обработчика Context menu в рамках одной dll.

А желтый цвет - это рисует система или ты?
Ответить с цитированием
  #13  
Старый 26.07.2013, 12:38
Zorkov Igor Zorkov Igor вне форума
Новичок
 
Регистрация: 28.07.2009
Сообщения: 85
Репутация: 50
По умолчанию

Это похоже при AList.Add('*') и AList.Add('lnkfile') одновременно

Все вкурил делаю только

AList.Add('*') и AList.Add('folder') регестрирую через regsvc32, так проще

Опередил ты меня ответом, это я выделил желтым что бы показать просто

Последний раз редактировалось M.A.D.M.A.N., 06.08.2013 в 23:51.
Ответить с цитированием
  #14  
Старый 06.08.2013, 21:39
Aniskin Aniskin вне форума
Прохожий
 
Регистрация: 29.06.2013
Сообщения: 9
Версия Delphi: 7 - XE4
Репутация: 10
По умолчанию

Исправил пару ошибок в библиотеке и добавил иконки (см. первое сообщение темы).
Ответить с цитированием
Этот пользователь сказал Спасибо Aniskin за это полезное сообщение:
Zorkov Igor (08.08.2013)
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 21:49.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter