Форум: "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