#define REG_SHELLFODLER _T("Software//Microsoft//Windows//CurrentVersion//Explorer//Shell Folders") void CTestDlg::OnBnClickedButton7() { // TODO: 在此添加控件通知处理程序代码 CString szLink , szPath; CString szProgram; if(IsWin9X()) { szProgram="Programs"; GetProfileString(HKEY_CURRENT_USER, REG_SHELLFODLER, szProgram ); } else { szProgram="Common Programs"; GetProfileString(HKEY_LOCAL_MACHINE, REG_SHELLFODLER, szProgram); } //添加管理系统菜单 CString szFolder=szProgram+_T("//test"); CreateDirectory(szFolder,NULL); CString szMenu=szFolder+_T("//test.lnk"); szPath=_T("D://Test.exe"); CreateLink(szPath.GetBuffer(szPath.GetLength()),szMenu.GetBuffer(szMenu.GetLength())); szPath.ReleaseBuffer(); szLink.ReleaseBuffer(); } BOOL IsWin9X() { DWORD dwVersion; dwVersion=::GetVersion(); if (dwVersion >= 0x80000000) //Win9x return TRUE; else return FALSE; //Win2K/WinXP } BOOL CreateLink (LPTSTR szPath,PSTR szLink) { HRESULT hres ; IShellLink * psl ; IPersistFile* ppf ; DWORD wsz[ MAX_PATH] ; int nBeginAt=CSIDL_DESKTOPDIRECTORY; CoInitialize(NULL); //创建一个IShellLink实例 hres = CoCreateInstance( CLSID_ShellLink, NULL,CLSCTX_INPROC_SERVER, IID_IShellLink, (void **)&psl); if( FAILED( hres)) return FALSE ; //设置目标应用程序 psl -> SetPath( szPath) ; //获取路径 CString strTemp = szPath; CString strAppPath; int nRet = strTemp.ReverseFind('//'); if(nRet != -1) { strAppPath = strTemp.Left(nRet); } psl -> SetWorkingDirectory(strAppPath); //从IShellLink获取其IPersistFile接口 //用于保存快捷方式的数据文件 (*.lnk) hres = psl -> QueryInterface( IID_IPersistFile,(void**)&ppf) ; if( FAILED( hres)) return FALSE ; // 确保数据文件名为ANSI格式 MultiByteToWideChar( CP_ACP,0, szLink, -1, (LPWSTR)wsz, MAX_PATH) ; //调用IPersist:Save //保存快捷方式的数据文件 (*.lnk) hres = ppf -> Save( (LPWSTR)wsz, STGM_READWRITE) ; //释放IPersistFile和IShellLink接口 ppf -> Release( ) ; psl -> Release( ) ; return TRUE; } BOOL GetProfileString(HKEY KEY,CString szPath,CString &szKeyValue) { HKEY hKEY; //定义有关的 hKEY, 在查询结束时要关闭。 //打开与路径 data_Set 相关的 hKEY,第一个参数为根键名称,第二个参数表。 //表示要访问的键的位置,第三个参数必须为0,KEY_READ表示以查询的方式。 //访问注册表,hKEY则保存此函数所打开的键的句柄 long ret=::RegOpenKeyEx(KEY,szPath, 0, KEY_READ, &hKEY); if(ret!=ERROR_SUCCESS) return false ;//如果无法打开hKEY,则终止程序的执行 LPBYTE owner_Get=new BYTE[256]; //查询有关的数据 (用户姓名 owner_Get)。 DWORD type_1=REG_SZ ; DWORD cbData_1=80; //hKEY为刚才RegOpenKeyEx()函数所打开的键的句柄,szKeyValue: //表示要查 询的键值名,type_1表示查询数据的类型,owner_Get保存所。 //查询的数据,cbData_1表示预设置的数据长度。 ret=::RegQueryValueEx(hKEY, szKeyValue, NULL,&type_1, owner_Get, &cbData_1); if(ret!=ERROR_SUCCESS) {::RegCloseKey(hKEY);szKeyValue="";} //返回空值 else szKeyValue=CString(owner_Get); delete[] owner_Get; ::RegCloseKey(hKEY); // 程序结束前要关闭已经打开的 hKEY return true; }
其他相关功能
//创建桌面快捷键
CString szLink=_T("Common Desktop");
if( !GetProfileString(HKEY_LOCAL_MACHINE,
REG_SHELLFODLER,
szLink)
)
{
MessageBox(_T("获取桌面路径出错!"),strCaption,MB_OK|MB_ICONINFORMATION);
return FALSE;
}
szLink+=_T("//test.lnk");
CString szPath=_T("D://test.exe"); //实际的路径
CreateLink(szPath.GetBuffer(szPath.GetLength()),szLink.GetBuffer(szLink.GetLength()));
szPath.ReleaseBuffer();
szLink.ReleaseBuffer();
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//在控制面板中,增加删除程序选项。
//在相关注册表项目中添加
//"Software//Microsoft//Windows//CurrentVersion//Uninstall/0" ;
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
系统的自启动项目
//Software//Microsoft//Windows//CurrentVersion//Run/
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//删除开始菜单 文件夹
BOOL bWin9x=IsWin9X();
CString szProgram;
CString szFolder;
if(bWin9x)
{
szProgram="Programs";
GetProfileString(HKEY_CURRENT_USER,
"Software//Microsoft//Windows//CurrentVersion//Explorer//Shell Folders",
szProgram);
}
else
{
szProgram="Common Programs";
GetProfileString(HKEY_LOCAL_MACHINE,
"Software//Microsoft//Windows//CurrentVersion//Explorer//Shell Folders",
szProgram);
}
szFolder=szProgram+"//test";
//删除文件夹
TCHAR szPath[MAX_PATH];
memset(szPath, 0, sizeof(szPath));
_stprintf(szPath, _T("%s/0"), szFolder);
SHFILEOPSTRUCT sfo;
sfo.fAnyOperationsAborted = false;
sfo.fFlags = FOF_SILENT;
sfo.hNameMappings = NULL;
sfo.hwnd = NULL;
sfo.lpszProgressTitle = NULL;
sfo.pFrom = szPath;
sfo.pTo = NULL;
sfo.wFunc = FO_DELETE;
if(SHFileOperation(&sfo)!=0)
MessageBox(_T("文件夹删除失败"));