转载:http://www.codefans.net/articles/1435.shtml
转载:http://www.cnblogs.com/morewindows/archive/2011/08/14/2138412.html
1 //浏览文件夹 2 BOOL CShortCutDlg::BrowseForFolder( 3 LPITEMIDLIST pidlRoot,//浏览开始处的PIDL 4 LPITEMIDLIST *ppidlDestination, 5 //浏览结束时所选择的PIDL 6 LPCSTR lpszTitle)//浏览对话框中的提示文字 7 { 8 BROWSEINFO BrInfo ; 9 ZeroMemory( &BrInfo, sizeof(BrInfo)) ; 10 BrInfo.hwndOwner = HWND_DESKTOP ; 11 BrInfo.pidlRoot = pidlRoot ; 12 BrInfo.lpszTitle = lpszTitle ; 13 //浏览文件夹 14 *ppidlDestination= SHBrowseForFolder(&BrInfo); 15 //用户选择了取消按钮 16 if(NULL == *ppidlDestination) 17 return FALSE ; 18 return TRUE ; 19 } 20 //取得快捷方式的目标应用程序名 21 BOOL CShortCutDlg::SelectMenuItem( LPSTR szFileName) 22 { 23 OPENFILENAME ofn ; 24 static CHAR szFilter[] = "Programs\0*.exe\0" ; 25 ZeroMemory(&ofn, sizeof( OPENFILENAME)) ; 26 ofn.lStructSize = sizeof( OPENFILENAME) ; 27 ofn.hwndOwner = HWND_DESKTOP; 28 ofn.lpstrFilter = szFilter ; 29 ofn.nFilterIndex = 0 ; 30 ofn.nMaxFile = MAX_PATH ; 31 ofn.lpstrTitle = "请选择目标应用程序:" ; 32 ofn.lpstrFile = szFileName ; 33 ofn.Flags = OFN_FILEMUSTEXIST | 34 OFN_PATHMUSTEXIST | OFN_EXPLORER ; 35 //文件浏览 36 if(!GetOpenFileName( &ofn))//选择了取消按钮 37 return FALSE ; 38 return TRUE ; 39 } 40 //取得要创建的快捷方式的名字 41 BOOL CShortCutDlg::GetShortcutCrt(LPSTR szPath) 42 { 43 LPITEMIDLIST pidlBeginAt, pidlDestination ; 44 45 // 取得开始菜单或桌面的PIDL 46 SHGetSpecialFolderLocation( HWND_DESKTOP, 47 nBeginAt, &pidlBeginAt) ; 48 // 取得要创建的快捷方式所在的位置 49 if( !BrowseForFolder(pidlBeginAt, &pidlDestination, 50 "请选择快捷方式所在的位置:")) 51 return FALSE ; 52 // 把PIDL转换为路径名 53 SHGetPathFromIDList( pidlDestination, szPath) ; 54 // 取得快捷方式名称 55 CNameDlg name_dlg; 56 if(name_dlg.DoModal() == IDCANCEL) 57 return FALSE ; 58 //把快捷方式名和扩展名.LNK添加到路径名后 59 //形成完整的快捷方式数据文件名 60 wsprintf(szPath+lstrlen(szPath),"\\%s.lnk", 61 name_dlg.m_strName) ; 62 return TRUE ; 63 } 64 //创建快捷方式 65 BOOL CShortCutDlg::CreateLink ( 66 LPSTR szPath,//快捷方式的目标应用程序名 67 LPSTR szLink)//快捷方式的数据文件名(*.lnk) 68 { 69 HRESULT hres ; 70 IShellLink * psl ; 71 IPersistFile* ppf ; 72 WORD wsz[ MAX_PATH] ; 73 //创建一个IShellLink实例 74 hres = CoCreateInstance( CLSID_ShellLink, NULL, 75 CLSCTX_INPROC_SERVER, IID_IShellLink, 76 (void **)&psl) ; 77 if( FAILED( hres)) 78 return FALSE ; 79 //设置目标应用程序 80 psl -> SetPath( szPath) ; 81 //设置快捷键(此处设为Shift+Ctrl+'R') 82 psl -> SetHotkey( MAKEWORD( 'R', 83 HOTKEYF_SHIFT |HOTKEYF_CONTROL)) ; 84 //从IShellLink获取其IPersistFile接口 85 //用于保存快捷方式的数据文件 (*.lnk) 86 hres = psl -> QueryInterface( IID_IPersistFile, 87 (void**)&ppf) ; 88 if( FAILED( hres)) 89 return FALSE ; 90 // 确保数据文件名为ANSI格式 91 MultiByteToWideChar( CP_ACP, 0, szLink, -1, 92 wsz, MAX_PATH) ; 93 //调用IPersistFile::Save 94 //保存快捷方式的数据文件 (*.lnk) 95 hres = ppf -> Save( wsz, STGM_READWRITE) ; 96 //释放IPersistFile和IShellLink接口 97 ppf -> Release( ) ; 98 psl -> Release( ) ; 99 return TRUE; 100 } 101 BOOL CShortCutDlg::DeleteFolder( LPSTR pszFolder) 102 { 103 SHFILEOPSTRUCT fos ; 104 105 ZeroMemory( &fos, sizeof( fos)) ; 106 fos.hwnd = HWND_DESKTOP; 107 fos.wFunc = FO_DELETE ; 108 fos.fFlags = FOF_SILENT | FOF_ALLOWUNDO ; 109 fos.pFrom = pszFolder ; 110 // 删除文件夹及其内容 111 if( 0 != SHFileOperation( &fos)) 112 return FALSE ; 113 return TRUE; 114 } 115 //取得要删除的快捷方式 116 BOOL CShortCutDlg::GetShortcutDel ( 117 LPSTR lpszInitDir,//选择文件的开始目录 118 LPSTR lpszShortcut)//快捷方式名 119 { 120 OPENFILENAME ofn ; 121 char szFilter[] = "Shortcuts\0*.lnk\0" ; 122 ZeroMemory(&ofn,sizeof( OPENFILENAME)); 123 ofn.lStructSize = sizeof( OPENFILENAME) ; 124 ofn.hwndOwner = HWND_DESKTOP ; 125 ofn.lpstrFilter = szFilter ; 126 ofn.nFilterIndex = 0 ; 127 ofn.nMaxFile = MAX_PATH ; 128 ofn.lpstrTitle = "请选择要删除的快捷方式:" ; 129 ofn.lpstrFile = lpszShortcut; 130 ofn.lpstrInitialDir = lpszInitDir ; 131 ofn.Flags = OFN_FILEMUSTEXIST | 132 OFN_PATHMUSTEXIST | OFN_EXPLORER | 133 OFN_NODEREFERENCELINKS ; 134 //文件浏览 135 if(! GetOpenFileName( &ofn))//选择了取消按钮 136 return FALSE ; 137 return TRUE ; 138 } 139 //删除快捷方式的数据文件 (*.lnk) 140 BOOL CShortCutDlg::DeleteLink( LPSTR lpszShortcut) 141 { 142 SHFILEOPSTRUCT fos ; 143 ZeroMemory( &fos, sizeof(fos)) ; 144 fos.hwnd = HWND_DESKTOP ; 145 fos.wFunc = FO_DELETE ; 146 fos.pFrom = lpszShortcut; 147 fos.pTo = NULL ; 148 fos.fFlags = FOF_SILENT | FOF_ALLOWUNDO ; 149 //删除快捷方式(*.lnk) 150 if( 0 != SHFileOperation( &fos)) 151 return FALSE ; 152 return TRUE ; 153 } 154 // 通知shell有关变化 155 void CShortCutDlg::NotifyShell(LONG wEventId,//事件标志 156 LPSTR szPath)//路径 157 { 158 SHChangeNotify( wEventId, 159 SHCNF_FLUSH | SHCNF_PATH, 160 szPath,0); 161 //取得szPath的父目录 162 char* p; 163 for( p=szPath+lstrlen(szPath)-1; 164 *p != '\\'; 165 p--); 166 *p='\0'; 167 SHChangeNotify(SHCNE_UPDATEDIR 168 |SHCNE_INTERRUPT, 169 SHCNF_FLUSH | SHCNF_PATH,szPath,0); 170 } 171 void CShortCutDlg::OnCreateGroup() 172 { 173 UpdateData(TRUE); 174 if(m_nLocation==0) 175 { 176 //设置起始文件夹为桌面 177 nBeginAt=CSIDL_DESKTOPDIRECTORY ; 178 } 179 else 180 { 181 //设置起始文件夹为“开始”菜单 182 nBeginAt=CSIDL_STARTMENU; 183 } 184 LPITEMIDLIST pidlBeginAt, pidlDestination ; 185 char szPath[ MAX_PATH] ; 186 // 取得开始菜单或桌面的PIDL 187 SHGetSpecialFolderLocation( HWND_DESKTOP, 188 nBeginAt, &pidlBeginAt) ; 189 // 取得新建文件夹的父文件夹 190 if( !BrowseForFolder(pidlBeginAt , 191 &pidlDestination, 192 "请选择新建文件夹/菜单组的位置:")) 193 return ; 194 // 把PIDL转换为路径名 195 SHGetPathFromIDList( pidlDestination, szPath) ; 196 //取得新建文件夹的名字 197 CNameDlg name_dlg; 198 if(name_dlg.DoModal() == IDCANCEL) 199 return; 200 //形成完整的新建文件夹名 201 wsprintf(szPath+lstrlen(szPath),"\\%s", 202 name_dlg.m_strName); 203 //创建文件夹(子目录) 204 if( !CreateDirectory( szPath, NULL)) 205 { 206 MessageBox( "创建文件夹失败!") ; 207 return ; 208 } 209 // 通知shell有关变化 210 NotifyShell( SHCNE_MKDIR|SHCNE_INTERRUPT, 211 szPath); 212 213 } 214 void CShortCutDlg::OnCreateItem() 215 { 216 UpdateData(TRUE); 217 if(m_nLocation==0) 218 { 219 //设置起始文件夹为桌面 220 nBeginAt=CSIDL_DESKTOPDIRECTORY ; 221 } 222 else 223 { 224 //设置起始文件夹为“开始”菜单 225 nBeginAt=CSIDL_STARTMENU; 226 } 227 char szPath[MAX_PATH]=""; 228 //快捷方式的目标应用程序名 229 char szLink[MAX_PATH]=""; 230 //快捷方式的数据文件名 231 // 取得快捷方式的目标应用程序名 232 if( !SelectMenuItem( szPath)) 233 return ; 234 // 取得新建快捷方式所在的文件夹 235 //并形成其数据文件名 236 if( !GetShortcutCrt( szLink)) 237 return ; 238 // 创建快捷方式 239 if(!CreateLink( szPath, szLink) ) 240 return; 241 // 通知shell有关变化 242 NotifyShell( SHCNE_CREATE|SHCNE_INTERRUPT, 243 szLink) ; 244 } 245 void CShortCutDlg::OnDeleteGroup() 246 { 247 UpdateData(TRUE); 248 if(m_nLocation==0) 249 { 250 //设置起始文件夹为桌面 251 nBeginAt=CSIDL_DESKTOPDIRECTORY ; 252 } 253 else 254 { 255 //设置起始文件夹为“开始”菜单 256 nBeginAt=CSIDL_STARTMENU; 257 } 258 LPITEMIDLIST pidlBeginAt, pidlFolder ; 259 char szPath[MAX_PATH]=""; 260 // 取得开始菜单或桌面的PIDL 261 SHGetSpecialFolderLocation( HWND_DESKTOP, 262 nBeginAt, &pidlBeginAt) ; 263 // 取得要删除的文件夹 264 if( !BrowseForFolder( pidlBeginAt, &pidlFolder, 265 "请选择要删除的文件夹/菜单组:")) 266 return ; 267 // 把PIDL转化为路径名 268 SHGetPathFromIDList( pidlFolder, szPath) ; 269 // 删除文件夹 270 if(!DeleteFolder( szPath)) 271 return ; 272 // 通知shell有关变化 273 NotifyShell( SHCNE_RMDIR|SHCNE_INTERRUPT, 274 szPath) ; 275 } 276 void CShortCutDlg::OnDeleteItem() 277 { 278 UpdateData(TRUE); 279 if(m_nLocation==0) 280 { 281 //设置起始文件夹为桌面 282 nBeginAt=CSIDL_DESKTOPDIRECTORY ; 283 } 284 else 285 { 286 //设置起始文件夹为“开始”菜单 287 nBeginAt=CSIDL_STARTMENU; 288 } 289 LPITEMIDLIST pidlBeginAt ; 290 char szShortcut[ MAX_PATH]="", 291 szPath[ MAX_PATH]=""; 292 // 取得开始菜单或桌面的PIDL 293 SHGetSpecialFolderLocation( HWND_DESKTOP, 294 nBeginAt, &pidlBeginAt) ; 295 // 把PIDL转化为路径名 296 SHGetPathFromIDList( pidlBeginAt, szPath) ; 297 // 取得要删除的快捷方式 298 if( !GetShortcutDel( szPath, szShortcut)) 299 return ; 300 // 删除快捷方式 301 if( !DeleteLink(szShortcut)) 302 return ; 303 // 通知SHELL有关改变 304 NotifyShell( SHCNE_DELETE|SHCNE_INTERRUPT, 305 szShortcut) ; 306 } 307 void CShortCutDlg::OnDestroy() 308 { 309 CoUninitialize(); 310 311 CDialog::OnDestroy(); 312 }