#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("文件夹删除失败"));
251





