转载: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 *.exe " ; 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 *.lnk " ; 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='