Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Прием ссылок из эксплорера [D7, Win2k]


Brenagwynn ©   (2004-06-17 19:12:00) 

Каким образом можно организовать сабж при помощи дрыга и дропа(а-ля ReGetовская корзина)? С файлами-то понятно, а вот как быть со ссылками?


Brenagwynn   (2004-06-18 11:29:00) [1]

Неее, как принимать файлы я знаю. И WM_DROPFILES не прокатывает.


VMcL   (2004-06-18 00:03:00) [2]

>>Brenagwynn  (17.06.04 19:12)

Или ты имеешь в виду, что не знаешь как прочитать параметры файла-ярлыка? Если да, то вот как-то так:


type
 TPathBuf = packed array [0 .. 4095] of Char;

 TLinkInfo = packed record
   Path: String;
   Args: String;
   WorkDir: String;
   ShowCmd: TWindowState;
   Descr: String;
   IconPath: String;
   IconIdx: Integer;
   Hotkey: Word;
 end;

function ReadLink(var ALink: TLinkInfo; const AFileName: String): Boolean;
var
 Obj: IUnknown;
 Lnk: IShellLink;
 pFile: IPersistFile;
 Cmd: Integer;
 WFileName: WideString;
 pc: TPathBuf;
 FD: TWin32FindData;
const
 Mx = SizeOf(pc) - 1;
begin
 Result := False;

 Obj := CreateComObject(CLSID_ShellLink);
 if Obj = nil then
   raise Exception.Create(
     'ReadLink: cannot create IShellLink interface object.');

 Lnk := Obj as IShellLink;
 pFile := Obj as IPersistFile;

 WFileName := WideString(AFileName);
 if pFile.Load(PWideChar(WFileName),
   stgm_Read or stgm_Share_Deny_Write) <> S_OK then Exit;

 if Lnk.GetDescription(pc, Mx) <> S_OK then Exit;
 ALink.Descr := String(pc);

 if Lnk.GetPath(pc, Mx, FD, 0) <> S_OK then Exit;
 ALink.Path := pc;

 if Lnk.GetArguments(pc, Mx) <> S_OK then Exit;
 ALink.Args := pc;

 if Lnk.GetWorkingDirectory(pc, Mx) <> S_OK then Exit;
 ALink.WorkDir := pc;

 if Lnk.GetShowCmd(Cmd) <> S_OK then Exit;
 case Cmd of
   sw_ShowNormal:       ALink.ShowCmd := wsNormal;
   sw_ShowMinNoActive:  ALink.ShowCmd := wsMinimized;
   sw_ShowMaximized:    ALink.ShowCmd := wsMaximized;
 else
   raise ERangeError.CreateFmt(
     'ReadLink: unexpected value of "show command" (%d).', [Cmd]);
 end;

 if Lnk.GetIconLocation(pc, Mx, ALink.IconIdx) <> S_OK then Exit;
 ALink.IconPath := String(pc);

 if Lnk.GetHotkey(ALink.Hotkey) <> S_OK then Exit;

 Result := True;
end;


DVM   (2004-06-17 22:57:00) [3]

IDropTarget интерфейс реализовать.
Есть компонент Drag 'n' Drop Component Suite, вроде, Андрис Меландер, кажется, автор (www.torry.net) - там можно глянуть как делается.

Хотя WM_DROPFILES может и прокатит, т.к. с помощью этого сообщения посылается список строк и необязательно это должны быть файлы.


VMcL   (2004-06-17 19:43:00) [4]

>>Brenagwynn  (17.06.04 19:12)

DragAcceptFiles() + WM_DROPFILES

Win32 SDK Help: Using the Drag-Drop Feature - там пример на C.


Наверх

Титульная страница Поиск, карта сайта Написать письмо