Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2007.07.22;
Скачать: [xml.tar.bz2];

Вниз

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

 
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 вся ветка

Форум: "WinAPI";
Текущий архив: 2007.07.22;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.038 c
2-1182612271
Ivolg
2007-06-23 19:24
2007.07.22
Получение параметров


3-1176452864
Nike
2007-04-13 12:27
2007.07.22
отображение DBGrid при пустом датасете


2-1182843090
Aragorn
2007-06-26 11:31
2007.07.22
Create(nil)


1-1179470162
DELORAC
2007-05-18 10:36
2007.07.22
GetDesktopWindow и Application.MessageBox


15-1182838955
GeLLeR
2007-06-26 10:22
2007.07.22
Будет ли TMediaPlayer





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский