![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Контекстное меню дла файла в сети [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]Аууу :)