COM C# shell 桌面

来源:互联网 发布:淘宝盗图怎么看投诉人 编辑:程序博客网 时间:2024/06/05 18:01
   
1.GetLogicalDriveStrings()得到各个盘符。2.GetDriveType()得到各个盘的类型。3.列出文件夹,文件,图标最简单的有两个办法。 (1)FindFirstFile() + FindNextFile() + FindClose()得到文件和文件夹    SHGetFileInfo()得到文件图标。    该法比较简单,但是不能做的象Explorer.exe完全一样。 (2)下面的方法比较繁琐,涉及到COM,但是不懂COM也没关系。而且这种办法    还可以实现1和2的功能。    SHGetDesktopFolder()得到桌面的IShellFolder接口loop:    调用IShellFolder::EnumObjects()得到IEnumIDList接口    用IEnumIDList接口列出所有内容,得到的是PIDL,    根据PIDL用IShellFolder::GetDisplayNameOf()得到桌面内的对象的名字,    根据PIDL用SHGetFileInfo()得到图标。    根据PIDL用IShellFolder::BindToObject()得到子对象的IShellFolder接口,重复loop,就可以得到所有的东东了。    是不是很麻烦,当时我的头都大了。不过这是正招,可以实现的和Explorer.exe一样。
VC6.0
LPITEMIDLIST pidl;LPMALLOC pShellMalloc;char szDir[200];if(SUCCEEDED(SHGetMalloc(&pShellMalloc))){if(SUCCEEDED(SHGetSpecialFolderLocation(NULL,CSIDL_DESKTOP,&pidl))) {// 如果成功返回trueSHGetPathFromIDList(pidl, szDir);pShellMalloc->Free(pidl);}pShellMalloc->Release();}::MessageBox (NULL,szDir,"Path",MB_OK);
C#:
  Enum = (IEnumIDList)Marshal.GetObjectForIUnknown(EnumPtr);                while (Enum.Next(1, out pidlSub, out celtFetched) == 0 && celtFetched == API.S_FALSE)                {                    string name = API.GetNameByIShell(root, pidlSub);                    IShellFolder iSub;                    root.BindToObject(pidlSub, IntPtr.Zero, ref Guids.IID_IShellFolder, out iSub);                    TreeNode nodeSub = new TreeNode(name);                    nodeSub.Tag = iSub;                    nodeSub.Nodes.Add("...");                    e.Node.Nodes.Add(nodeSub);
0 0
原创粉丝点击