Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.07.22;
Скачать: CL | DM;

Вниз

Добавить пункт к контекстному меню.   Найти похожие ветки 

 
DevilDevil ©   (2007-02-10 18:26) [0]

Необходимо, чтобы над определённым типом файлов пожно было производить действия посредством контекстного меню. Вроде и пример прилагается, и статей в Сети много, всёравно недопонимаю...

Основные вопросы на данный момент:

- куда скопировать dll
- как зарегистрировать dll в системе
- как определить, является ли файл того типа, который мне нужен


 
Eraser ©   (2007-02-11 00:39) [1]

> [0] DevilDevil ©   (10.02.07 18:26)

http://rouse.drkb.ru/winapi.php


 
DevilDevil ©   (2007-02-11 01:05) [2]

Хм. где там о контекстном меню?


 
TRUNK ©   (2007-02-11 01:27) [3]


> - куда скопировать dll

Куда угодно, лишь бы в реестре был указан правильный путь к ней

> - как зарегистрировать dll в системе

Самый простой способ - вызвать её функцию DllRegisterServer

> - как определить, является ли файл того типа, который мне нужен

Самый простой способ - изначально зарегистрировать под нужными расширениями


 
Eraser ©   (2007-02-11 02:02) [4]

> [2] DevilDevil ©   (11.02.07 01:05)
> Хм. где там о контекстном меню?

забей и забудь :)


 
DevilDevil ©   (2007-02-11 04:21) [5]

Следующая порция вопросов:

1) Как сочетанием клавиш сгенерировать TGUID ? Стало быть, если изменять пример в поставке к Delphi, нужно заменить Class_ContextMenu сгенерированным?

2) нет ли универсальной функции регистрации/удаления в реестре DLL-и за одним/несколькими расширениями файлов? Например, если собираешься регистрироваться для изображений "*.jpg", то дальнейшие записи необходимо делать не в произвольный ключ реестра, а уже готовый, "JpegFile".

Если кто-нибудь приведёт более универсальные функции, буду благодарен.


 
DevilDevil ©   (2007-02-12 03:06) [6]

up


 
TRUNK ©   (2007-02-12 09:45) [7]

> Как сочетанием клавиш сгенерировать TGUID ?
Ctrl+Shift+G

> нет ли универсальной функции регистрации/удаления в реестре DLL
> и за одним/несколькими расширениями файлов
Регистрация состоит из двух этапов: 1) регистрация самой DLL в качестве
ContextMenuHandler; 2) добавление GUIDа этой DLL в список ContextMenuHandler"ов для определённого расширения.
Про первый этап я уже писал (TRUNK© (11.02.07 01:27) [3]). Что касается второго - тут есть два варианта:

вариант 1a:
[HKEY_CLASSES_ROOT\*.jpg\shellex\ContextMenuHandlers\{CLSID обработчика}]

вариант 1b:
[HKEY_CLASSES_ROOT\*.jpg\shellex\ContextMenuHandlers\Имя_обработчика] @={CLSID обработчика}

вариант 2:
[HKEY_CLASSES_ROOT\*.jpg] @=JpgFile
[HKEY_CLASSES_ROOT\JpgFile\shellex\ContextMenuHandlers\{CLSID обработчика}]

P.S. @ - это значение "по умолчанию"


 
Rouse_ ©   (2007-02-12 10:08) [8]

Узнать о типе файла посредством реализации метода IShellExtInit::Initialize():

например:
   function IShellExtInit.Initialize = SEIInitialize;
   function SEIInitialize(pidlFolder: PItemIDList; lpdobj: IDataObject;
     hKeyProgID: HKEY): HResult; stdcall;

реализация:
function TFWPropertySheet.SEIInitialize(pidlFolder: PItemIDList;
 lpdobj: IDataObject; hKeyProgID: HKEY): HResult; stdcall;
const
 ValidExt: array [0..8] of String[4] =
   (".exe", ".dll", ".ocx", ".scr", ".cpl", ".tlb", ".olb", ".bpl", ".sys");
var
 StgMedium: TStgMedium;
 FormatEtc: TFormatEtc;
 FilesCount, I: Integer;
 FileExt: String;
 IsValidExt: Boolean;
begin

 if (lpdobj = nil) then
 begin
   Result := E_INVALIDARG;
   Exit;
 end;

 with FormatEtc do begin
   cfFormat := CF_HDROP;
   ptd      := nil;
   dwAspect := DVASPECT_CONTENT;
   lindex   := -1;
   tymed    := TYMED_HGLOBAL;
 end;
 
 Result := lpdobj.GetData(FormatEtc, StgMedium);
 if Failed(Result) then Exit;
 try
   FilesCount := DragQueryFile(StgMedium.hGlobal, DWORD(-1), nil, 0);
   if FilesCount <> 1  then
     Result := E_FAIL
   else
   begin
     FileName := CoTaskMemAlloc(MAX_PATH);
     DragQueryFile(StgMedium.hGlobal, 0, FileName, MAX_PATH);
     FileExt := LowerCase(ExtractFileExt(String(FileName)));
     IsValidExt := False;
     for I := 0 to Length(ValidExt) - 1 do
       if ValidExt[I] = FileExt then
       begin
         IsValidExt := True;
         Break;
       end;
     if IsValidExt then
       Result := S_OK
     else
       Result := E_FAIL;
   end;
 finally
   ReleaseStgMedium(StgMedium);
 end;
end;

Список расширений как вариант можно держать в реестре, а не как у меня в виде константного массива...


 
имя   (2007-02-12 13:24) [9]

Удалено модератором


 
DevilDevil ©   (2007-02-12 16:59) [10]

> TRUNK ©   (12.02.07 09:45) [7]

Допустим, для *.jpg уже есть @=JpgFile, а я впишу:
[HKEY_CLASSES_ROOT\*.jpg\shellex\ContextMenuHandlers\{CLSID обработчика}]
всё будет работать корректно?


 
TRUNK ©   (2007-02-13 09:23) [11]


> DevilDevil ©   (12.02.07 16:59) [10]

По идее, в этом случае для JPEG файла будут используются обработчики из обоих ключей:
[HKEY_CLASSES_ROOT\*.jpg\shellex\ContextMenuHandlers]
[HKEY_CLASSES_ROOT\JpgFile\shellex\ContextMenuHandlers]


 
DevilDevil ©   (2007-02-13 13:32) [12]

ВСЕМ ОГРОМНОЕ СПАСИБО, на днях попробую



Страницы: 1 вся ветка

Текущий архив: 2007.07.22;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.024 c
2-1182860818
ы!
2007-06-26 16:26
2007.07.22
скрытие


15-1182599993
NailMan
2007-06-23 15:59
2007.07.22
Классные видеоряды на наши Ну-Погоди!


15-1182353896
Тохер
2007-06-20 19:38
2007.07.22
Распознование картинки. Как?


2-1183115310
Nikfel
2007-06-29 15:08
2007.07.22
Как нарисовать точку.


9-1156370315
Nobody_1988
2006-08-24 01:58
2007.07.22
About Shaders