![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Добавить пункт к контекстному меню.
DevilDevil © (2007-02-10 18:26:00)Необходимо, чтобы над определённым типом файлов пожно было производить действия посредством контекстного меню. Вроде и пример прилагается, и статей в Сети много, всёравно недопонимаю...
Основные вопросы на данный момент:
- куда скопировать dll
- как зарегистрировать dll в системе
- как определить, является ли файл того типа, который мне нужен
DevilDevil (2007-02-13 13:32:00) [1]ВСЕМ ОГРОМНОЕ СПАСИБО, на днях попробую
TRUNK (2007-02-13 09:23:00) [2]
> DevilDevil © (12.02.07 16:59) [10]
По идее, в этом случае для JPEG файла будут используются обработчики из обоих ключей:
[HKEY_CLASSES_ROOT\*.jpg\shellex\ContextMenuHandlers]
[HKEY_CLASSES_ROOT\JpgFile\shellex\ContextMenuHandlers]
DevilDevil (2007-02-12 16:59:00) [3]> TRUNK © (12.02.07 09:45) [7]
Допустим, для *.jpg уже есть@=JpgFile, а я впишу:
[HKEY_CLASSES_ROOT\*.jpg\shellex\ContextMenuHandlers\{CLSID обработчика}]
всё будет работать корректно?
(2007-02-12 13:24:00) [4]Удалено модератором
Rouse_ (2007-02-12 10:08:00) [5]Узнать о типе файла посредством реализации метода 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;
Список расширений как вариант можно держать в реестре, а не как у меня в виде константного массива...
TRUNK (2007-02-12 09:45:00) [6]> Как сочетанием клавиш сгенерировать 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. @ - это значение "по умолчанию"
DevilDevil (2007-02-12 03:06:00) [7]up
DevilDevil (2007-02-11 04:21:00) [8]Следующая порция вопросов:
1) Как сочетанием клавиш сгенерировать TGUID ? Стало быть, если изменять пример в поставке к Delphi, нужно заменить Class_ContextMenu сгенерированным?
2) нет ли универсальной функции регистрации/удаления в реестре DLL-и за одним/несколькими расширениями файлов? Например, если собираешься регистрироваться для изображений "*.jpg", то дальнейшие записи необходимо делать не в произвольный ключ реестра, а уже готовый, "JpegFile".
Если кто-нибудь приведёт более универсальные функции, буду благодарен.
Eraser (2007-02-11 02:02:00) [9]> [2] DevilDevil © (11.02.07 01:05)
> Хм. где там о контекстном меню?
забей и забудь :)
TRUNK (2007-02-11 01:27:00) [10]
> - куда скопировать dll
Куда угодно, лишь бы в реестре был указан правильный путь к ней
> - как зарегистрировать dll в системе
Самый простой способ - вызвать её функцию DllRegisterServer
> - как определить, является ли файл того типа, который мне нужен
Самый простой способ - изначально зарегистрировать под нужными расширениями
DevilDevil (2007-02-11 01:05:00) [11]Хм. где там о контекстном меню?
Eraser (2007-02-11 00:39:00) [12]> [0] DevilDevil © (10.02.07 18:26)
http://rouse.drkb.ru/winapi.php