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

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

Контекстное меню дла файла в сети [D7, Win95/98, WinME, NT4, Win2k, WinXP]


_Seldon_ ©   (2005-04-18 20:12:00) 

Для показа контекстного меню использую такой код:

OleInitialize(nil);
 PMenu:=TPopupMenu.Create(Application);
 SHGetDesktopFolder(IShFolder);

 Dirs:=TStringList.Create;
 try
   Delete(FileName,1,2);
   Dirs.Text:=FastReplace(FileName,'\',#13#10);
   Dirs[0]:='\\'+Dirs[0];

   for a:=0 to Dirs.Count-2 do
   begin
     MultiByteToWideChar(CP_ACP,MB_PRECOMPOSED,PChar(Dirs[a]),-1,@szOleChar,SizeOf(szOleChar));
     IShFolder.ParseDisplayName(0,nil,@szOleChar,Tmp,IdList,Tmp); {!!!}
     IShFolder.BindToObject(IdList,nil,IID_IShellFolder,Pointer(IShFolder));
   end;

   MultiByteToWideChar(CP_ACP,MB_PRECOMPOSED,PChar(Dirs[Dirs.Count-1]),-1,@szOleChar,SizeOf(szOleChar));
   IShFolder.ParseDisplayName(0,nil,@szOleChar,Tmp,IdList,Tmp);
 finally
   Dirs.Free;
 end;

 IShFolder.GetUIObjectOf(Application.Handle,1,IdList,IID_IContextMenu,nil,Pointer(IMenu));
 IMenu.QueryInterface(IID_IContextMenu2,ActiveIContextMenu);
 IMenu.QueryContextMenu(PMenu.Handle,0,1,$7fff,CMF_EXPLORE);
 idCmd:=Word(TrackPopupMenu(PMenu.Handle,TPM_LEFTALIGN or TPM_RETURNCMD or TPM_RIGHTBUTTON,Pos.X,Pos.Y,0,Application.Handle,nil));
 if idCmd>0 then
   with cmi do
   begin
     IMenu.GetCommandString(idCmd-1,GCS_VERB,nil,@cmd_verb,MAX_PATH);
     cbSize:=SizeOf(cmi);
     fMask:=0;
     hwnd:=Application.Handle;
     lpVerb:=PChar(idCmd-1);
     dwHotkey:=0;
     hicon:=0;
     nShow:=SW_SHOWNORMAL;
     lpParameters:=nil;
     lpDirectory:=nil;
     IMenu.InvokeCommand(cmi);
   end;


Для локальных файлов он работает, а для файлов, расположенных в сети - нет. В стороке, помеченной !!! на второй итерации IdList всегда равен nil. В чём ошибка?


nikkie   (2005-04-20 23:46:00) [1]

а как же это на локальных файлах работает?


_Seldon_   (2005-04-20 17:17:00) [2]

удаление \\ из имён вида \\somecomp


nikkie   (2005-04-20 00:16:00) [3]

вот это что такое?

>Delete(FileName,1,2);


_Seldon_   (2005-04-19 22:20:00) [4]

Аууу :)


Наверх

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