首先: 在 stdafx.h中要加入: #include "atlbase.h"
设置->Link 要引入库 : Wininet.lib shlwapi.lib
//在对话框的头文件中加入:
01. #include
"wininet.h"
02. #include
"UrlHist.h"
03.
04. #define
SWEEP_BUFFER_SIZE 10000
05.
06. public :
07.
08. enum DEL_CACHE_TYPE //要删除的类型。
09. {
10. File, //表示internet临时文件
11. Cookie //表示Cookie
12. };
//以下为一些辅助函数 ( 辅助函数的具体实现参见源代码中.限于篇幅不再给出 )
01. BOOL DeleteUrlCache(DEL_CACHE_TYPE
type);
02. BOOL EmptyDirectory( LPCTSTR szPath, BOOL bDeleteDesktopIni
= FALSE, BOOL bWipeIndexDat
= FALSE); //清空一个目录
03. BOOL IsWindowsNT(); //判断系统
04. BOOL IsWindows2k();
05. BOOL GetUserSid(PSID*
ppSid);
06. void GetSidString(PSID
pSid, LPTSTR szBuffer);
07. BOOL GetOldSD( HKEY hKey, LPCTSTR pszSubKey, BYTE **
pSD);
08. BOOL CreateNewSD(PSID
pSid, SECURITY_DESCRIPTOR* pSD, PACL* ppDacl);
09. BOOL RegSetPrivilege( HKEY hKey, LPCTSTR pszSubKey,
SECURITY_DESCRIPTOR* pSD, BOOL bRecursive);
10. BOOL WipeFile( LPCTSTR szDir, LPCTSTR szFile);
//现在我们可以分别实现每项清除功能。
1、清除IE临时文件
1. TCHAR szPath[MAX_PATH];
2. DeleteUrlCache(File);
3. if (SHGetSpecialFolderPath(NULL,
szPath, CSIDL_INTERNET_CACHE, FALSE))
4. { //得到临时目录,并清空它.
5. EmptyDirectory(szPath);
6. }
清除IE临时文件的另外一个途径是直接调用Wininet函数,请看下面用于清除IE临时文件的函数
01. BOOL DelTempFiles()
02. {
03. BOOL bResult
= FALSE;
04. BOOL bDone
= FALSE;
05. LPINTERNET_CACHE_ENTRY_INFO
lpCacheEntry = NULL;
06.
07. DWORD dwTrySize,
dwEntrySize = 4096; //
start buffer size
08. HANDLE hCacheDir
= NULL;
09. DWORD dwError
= ERROR_INSUFFICIENT_BUFFER;
10.
11. do
12. {
13. switch (dwError)
14. {
15. //
need a bigger buffer
16. case ERROR_INSUFFICIENT_BUFFER:
17. delete []
lpCacheEntry;
18. lpCacheEntry
= (LPINTERNET_CACHE_ENTRY_INFO) new char [dwEntrySize];
19. lpCacheEntry->dwStructSize
= dwEntrySize;
20. dwTrySize
= dwEntrySize;
21. BOOL bSuccess;
22. if (hCacheDir
== NULL)
23.
24. bSuccess
= (hCacheDir
25. =
FindFirstUrlCacheEntry(NULL, lpCacheEntry,
26. &dwTrySize))
!= NULL;
27. else
28. bSuccess
= FindNextUrlCacheEntry(hCacheDir, lpCacheEntry, &dwTrySize);
29.
30. if (bSuccess)
31. dwError
= ERROR_SUCCESS;
32. else
33. {
34. dwError
= GetLastError();
35. dwEntrySize
= dwTrySize; //
use new size returned
36. }
37. break ;
38.
39. //
we are done
40. case ERROR_NO_MORE_ITEMS:
41. bDone
= TRUE;
42. bResult
= TRUE;
43. break ;
44.
45. //
we have got an entry
46. case ERROR_SUCCESS:
47.
48. //
don‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘t delete cookie entry
49. if (!(lpCacheEntry->CacheEntryType
& COOKIE_CACHE_ENTRY))
50.
51. DeleteUrlCacheEntry(lpCacheEntry->lpszSourceUrlName);
52.
53. //
get ready for next entry
54. dwTrySize
= dwEntrySize;
55. if (FindNextUrlCacheEntry(hCacheDir,
lpCacheEntry, &dwTrySize))
56. dwError
= ERROR_SUCCESS;
57.
58. else
59. {
60. dwError
= GetLastError();
61. dwEntrySize
= dwTrySize; //
use new size returned
62. }
63. break ;
64.
65. //
unknown error
66. default :
67. bDone
= TRUE;
68. break ;
69. }
70.
71. if (bDone)
72. {
73. delete []
lpCacheEntry;
74. if (hCacheDir)
75. FindCloseUrlCache(hCacheDir);
76.
77. }
78. } while (!bDone);
79. return bResult;
80. }
2、Cookie的清除
1. TCHAR szPath[MAX_PATH];
2. DeleteUrlCache(Cookie);
3. if (SHGetSpecialFolderPath(NULL,
szPath, CSIDL_COOKIES, FALSE))
4. { //得到目录,并清空
5. EmptyDirectory(szPath);
6. }
3、浏览器地址栏历史地址的清除
1. SHDeleteKey(HKEY_CURRENT_USER,
2. _T( "Software\\Microsoft\\Internet
Explorer\\TypedURLs" ));
4、清除表单自动完成历史记录
01. CString
sKey;
02. DWORD dwRet;
03.
04. if (IsWindows2k()
|| IsWindowsNT()) //先判断系统
05. {
06. CString
sBaseKey;
07. SECURITY_DESCRIPTOR
NewSD;
08. BYTE *
pOldSD;
09. PACL
pDacl = NULL;
10. PSID
pSid = NULL;
11. TCHAR szSid[256];
12. if (GetUserSid(&pSid))
13. {
14. //get
the hiden key name
15. GetSidString(pSid,
szSid);
16.
17. sKey
= _T( "Software\\Microsoft\\Protected
Storage System Provider\\" );
18. sKey
+= szSid;
19.
20. //get
old SD
21. sBaseKey
= sKey;
22. GetOldSD(HKEY_CURRENT_USER,
sBaseKey, &pOldSD);
23.
24. //set
new SD and then clear
25. if (CreateNewSD(pSid,
&NewSD, &pDacl))
26. {
27. RegSetPrivilege(HKEY_CURRENT_USER,
sKey, &NewSD, FALSE);
28.
29. sKey
+= _T( "\\Data" );
30. RegSetPrivilege(HKEY_CURRENT_USER,
sKey, &NewSD, FALSE);
31.
32. sKey
+= _T( "\\e161255a-37c3-11d2-bcaa-00c04fd929db" );
33. RegSetPrivilege(HKEY_CURRENT_USER,
sKey, &NewSD, TRUE);
34.
35. dwRet
= SHDeleteKey(HKEY_CURRENT_USER, sKey);
36. }
37.
38. if (pDacl
!= NULL)
39. HeapFree(GetProcessHeap(),
0, pDacl);
40.
41. //restore
old SD
42. if (pOldSD)
43. {
44. RegSetPrivilege(HKEY_CURRENT_USER,
sBaseKey,
45. (SECURITY_DESCRIPTOR*)pOldSD,
FALSE);
46. delete pOldSD;
47. }
48. }
49. if (pSid)
50. HeapFree(GetProcessHeap(),
0, pSid);
51. }
52.
53. //win9x
54. DWORD dwSize
= MAX_PATH;
55. TCHAR szUserName[MAX_PATH];
56. GetUserName(szUserName,
&dwSize);
57.
58. sKey
= _T( "Software\\Microsoft\\Protected
Storage System Provider\\" );
59. sKey
+= szUserName;
60. sKey
+= _T( "\\Data\\e161255a-37c3-11d2-bcaa-00c04fd929db" );
61. dwRet
= SHDeleteKey(HKEY_LOCAL_MACHINE, sKey);
5、清除自动密码历史记录
1. SHDeleteKey(HKEY_CURRENT_USER,
2. _T( "Software\\Microsoft\\Internet
Explorer\\IntelliForms" ));
6、清收藏夹中的内容
1. TCHAR szPath[MAX_PATH];
2. if (SHGetSpecialFolderPath(NULL,
szPath, CSIDL_FAVORITES, FALSE))
3. { //得到目录,并清空
4. EmptyDirectory(szPath);
5. }
7、清RAS自动拨号历史记录
1. SHDeleteKey(HKEY_CURRENT_USER,
2. _T( "Software\\Microsoft\\RAS
Autodial\\Addresses" ));
8、清系统临时文件夹
1. TCHAR szPath[MAX_PATH];
2. if (GetTempPath(MAX_PATH,
szPath)) //得到系统临时目录
3. {
4. EmptyDirectory(szPath,
TRUE);
5. }
9、清空回收站
1. SHEmptyRecycleBin(NULL,
NULL,
2.
3. SHERB_NOCONFIRMATION
| SHERB_NOPROGRESSUI | SHERB_NOSOUND);
10、清除"运行"中的自动匹配历史记录
1. SHDeleteKey(HKEY_CURRENT_USER,
2. _T("Software\\Microsoft\\Windows\\
3. CurrentVersion\\Explorer\\RunMRU"));
11、清"文档"中的历史记录
1. TCHAR szPath[MAX_PATH];
2. if (SHGetSpecialFolderPath(NULL,
szPath, CSIDL_RECENT, FALSE))
3. {
4. EmptyDirectory(szPath);
5. }
6. SHDeleteKey(HKEY_CURRENT_USER,
7. _T("Software\\Microsoft\\Windows\\CurrentVersion
8. \\Explorer\\RecentDocs"));
12、清除上次登陆用户记录
01. SHDeleteValue(HKEY_CURRENT_USER,
02. _T("Software\\Microsoft\\Windows
NT\\
03. CurrentVersion\\Winlogon"),
04. _T( "DefaultUserName" ));
05. SHDeleteValue(HKEY_CURRENT_USER,
06. _T("Software\\Microsoft\\Windows
NT\\
07. CurrentVersion\\Winlogon"),
08. _T( "AltDefaultUserName" ));
09. SHDeleteValue(HKEY_LOCAL_MACHINE,
10. _T("Software\\Microsoft\\Windows\\
11. CurrentVersion\\Winlogon"),
12. _T( "DefaultUserName" ));
13、清除"查找文件"自动匹配历史记录
01. SHDeleteKey(HKEY_CURRENT_USER,
02. _T("Software\\Microsoft\\Windows\\
03. CurrentVersion\\Explorer\\Doc
Find Spec
04. MRU"));
05. SHDeleteKey(HKEY_CURRENT_USER,
06. _T("Software\\Microsoft\\Internet
Explorer
07. \\Explorer
Bars\\{C4EE31F3-4768-11D2-BE5C-00A0C9A83DA1}
08. \\ContainingTextMRU"));
09. SHDeleteKey(HKEY_CURRENT_USER,
10. _T("Software\\Microsoft\\Internet
Explorer
11. \\Explorer
Bars\\{C4EE31F3-4768-11D2-BE5C-00A0C9A83DA1}
12. \\FilesNamedMRU"));
14、清除"查找计算机"自动匹配历史记录
1. SHDeleteKey(HKEY_CURRENT_USER,
2. _T("Software\\Microsoft\\Windows\\CurrentVersion
3. \\Explorer\\FindComputerMRU"));
4. SHDeleteKey(HKEY_CURRENT_USER,
5. _T("Software\\Microsoft\\Internet
Explorer\\Explorer Bars
6. \\{C4EE31F3-4768-11D2-BE5C-00A0C9A83DA1}
7. \\ComputerNameMRU"));
15、清除网络联接历史记录
1. TCHAR szPath[MAX_PATH];
2. if (SHGetSpecialFolderPath(NULL,
szPath, CSIDL_NETHOOD, FALSE))
3. { //得到目录,并清空
4. EmptyDirectory(szPath);
5. }
16、清远程登录历史记录
01. CString
sKey;
02. for ( int i=1;
i<=8; i++)
03. {
04. sKey.Format(_T( "Machine%d" ),
i);
05. SHDeleteValue(HKEY_CURRENT_USER,
06. _T( "Software\\Microsoft\\Telnet" ),
sKey);
07.
08. sKey.Format(_T( "Service%d" ),
i);
09. SHDeleteValue(HKEY_CURRENT_USER,
10. _T( "Software\\Microsoft\\Telnet" ),
sKey);
11.
12. sKey.Format(_T( "TermType%d" ),
i);
13. SHDeleteValue(HKEY_CURRENT_USER,
14. _T( "Software\\Microsoft\\Telnet" ),
sKey);
15. }
16. SHDeleteValue(HKEY_CURRENT_USER,
17. _T( "Software\\Microsoft\\Telnet" ),
_T( "LastMachine" ));
18. SHDeleteValue(HKEY_CURRENT_USER,
19. _T( "Software\\Microsoft\\Telnet" ),
_T( "LastService" ));
20. SHDeleteValue(HKEY_CURRENT_USER,
21. _T( "Software\\Microsoft\\Telnet" ),
_T( "LastTermType" ));
17、清浏览网址历史记录
下面这个函数可以用于清除网址历史记录
01. #include
"SHLGUID.H"
02. HRESULT ClearHistory()
03. {
04. HRESULT hr;
05. CoInitialize(NULL);
06. {
07. IUrlHistoryStg2*
pUrlHistoryStg2 = NULL;
08. hr=
CoCreateInstance(CLSID_CUrlHistory,NULL,1, IID_IUrlHistoryStg2,( void **)&pUrlHistoryStg2);
09. if (SUCCEEDED(hr))
10. {
11. hr
= pUrlHistoryStg2->ClearHistory();
12. pUrlHistoryStg2->Release();
13. }
14. }
15. CoUninitialize();
16. return hr;
17. }
// 如果上面代码不能清
// 则有下面的,不完美,但能工作.
01. TCHAR szPath[MAX_PATH];
02. GetWindowsDirectory(szPath,
MAX_PATH);
03. _tcscat(szPath,
_T( "\\History" ));
04. EmptyDirectory(szPath,
FALSE, TRUE);
05.
06. if (SHGetSpecialFolderPath(NULL,
szPath, CSIDL_HISTORY, FALSE))
07. {
08. EmptyDirectory(szPath,
FALSE, TRUE);
09. }
|