windows運(yùn)行命令詳解
winver---------檢查Windows版本
wmimgmt.msc----打開(kāi)windows管理體系結(jié)構(gòu)(WMI)
wupdmgr--------windows更新程序
wscript--------windows腳本宿主設(shè)置
write----------寫(xiě)字板
winmsd---------系統(tǒng)信息
wiaacmgr-------掃描儀和照相機(jī)向?qū)?
winchat--------XP自帶局域網(wǎng)聊天
mem.exe--------顯示內(nèi)存使用情況
Msconfig.exe---系統(tǒng)配置實(shí)用程序
mplayer2-------簡(jiǎn)易widnows media player
mspaint--------畫(huà)圖板
mstsc----------遠(yuǎn)程桌面連接
mplayer2-------媒體播放機(jī)
magnify--------放大鏡實(shí)用程序
mmc------------打開(kāi)控制臺(tái)
mobsync--------同步命令
dxdiag---------檢查DirectX信息
drwtsn32------ 系統(tǒng)醫(yī)生
devmgmt.msc--- 設(shè)備管理器
dfrg.msc-------磁盤(pán)碎片整理程序
diskmgmt.msc---磁盤(pán)管理實(shí)用程序
dcomcnfg-------打開(kāi)系統(tǒng)組件服務(wù)
ddeshare-------打開(kāi)DDE共享設(shè)置
dvdplay--------DVD播放器
net stop messenger-----停止信使服務(wù)
net start messenger----開(kāi)始信使服務(wù)
notepad--------打開(kāi)記事本
nslookup-------網(wǎng)絡(luò)管理的工具向?qū)?
ntbackup-------系統(tǒng)備份和還原
narrator-------屏幕“講述人”
ntmsmgr.msc----移動(dòng)存儲(chǔ)管理器
ntmsoprq.msc---移動(dòng)存儲(chǔ)管理員操作請(qǐng)求
netstat -an----(TC)命令檢查接口
syncapp--------創(chuàng)建一個(gè)公文包
sysedit--------系統(tǒng)配置編輯器
sigverif-------文件簽名驗(yàn)證程序
sndrec32-------錄音機(jī)
shrpubw--------創(chuàng)建共享文件夾
secpol.msc-----本地安全策略
syskey---------系統(tǒng)加密,一旦加密就不能解開(kāi),保護(hù)windows xp系統(tǒng)的雙重密碼
services.msc---本地服務(wù)設(shè)置
Sndvol32-------音量控制程序
sfc.exe--------系統(tǒng)文件檢查器
sfc /scannow---windows文件保護(hù)
tsshutdn-------60秒倒計(jì)時(shí)關(guān)機(jī)命令
tourstart------xp簡(jiǎn)介(安裝完成后出現(xiàn)的漫游xp程序)
taskmgr--------任務(wù)管理器
eventvwr-------事件查看器
eudcedit-------造字程序
explorer-------打開(kāi)資源管理器
packager-------對(duì)象包裝程序
perfmon.msc----計(jì)算機(jī)性能監(jiān)測(cè)程序
progman--------程序管理器
regedit.exe----注冊(cè)表
rsop.msc-------組策略結(jié)果集
regedt32-------注冊(cè)表編輯器
rononce -p ----15秒關(guān)機(jī)
regsvr32 /u *.dll----停止dll文件運(yùn)行
regsvr32 /u zipfldr.dll------取消ZIP支持
cmd.exe--------CMD命令提示符
chkdsk.exe-----Chkdsk磁盤(pán)檢查
certmgr.msc----證書(shū)管理實(shí)用程序
calc-----------啟動(dòng)計(jì)算器
charmap--------啟動(dòng)字符映射表
cliconfg-------SQL SERVER 客戶端網(wǎng)絡(luò)實(shí)用程序
Clipbrd--------剪貼板查看器
conf-----------啟動(dòng)netmeeting
compmgmt.msc---計(jì)算機(jī)管理
cleanmgr-------垃圾整理
ciadv.msc------索引服務(wù)程序
osk------------打開(kāi)屏幕鍵盤(pán)
odbcad32-------ODBC數(shù)據(jù)源管理器
oobe/msoobe /a----檢查XP是否激活
lusrmgr.msc----本機(jī)用戶和組
logoff---------注銷命令
iexpress-------木馬捆綁工具,系統(tǒng)自帶
Nslookup-------IP地址偵測(cè)器
fsmgmt.msc-----共享文件夾管理器
utilman--------輔助工具管理器
gpedit.msc-----組策略
posted @
2006-05-25 01:08 Jerry Cat 閱讀(506) |
評(píng)論 (0) |
編輯 收藏
??? [轉(zhuǎn)]使用Shell API讀取"特殊"路徑設(shè)置
????最近編碼,在取用戶文檔數(shù)據(jù)目錄時(shí),遇到問(wèn)題:
????我的做法是:<系統(tǒng)盤(pán)>?+?"\Documents?and?Settings\"?+?<用戶名>?+?"\Application?Data\"
????為啥這么麻煩,因?yàn)楫?dāng)時(shí)我沒(méi)有找到合適的API,有什么問(wèn)題呢?
????問(wèn)題出在用戶名,假如我的用戶名是Stone,但文檔數(shù)據(jù)目錄卻有可能存在兩種,一是:Stone,
還有可能是?Stone.域名。但實(shí)際上Stone都是域用戶。出現(xiàn)此情況的原因不明。而取用戶名的函數(shù)用
的是?GetUserName(也試過(guò)其它),域名當(dāng)然也可以取出,但何時(shí)帶域名,何時(shí)不帶域名的規(guī)律不得而
知。?
??? 所以,還是只能去查到API,其實(shí)Windows?Shell?API有此類函數(shù),只不過(guò)使用比較特殊。
????代碼如下:?
????LPITEMIDLIST?pidl;
????SHGetSpecialFolderLocation(NULL,CSIDL_APPDATA,&pidl);
????if?(?pidl?)?{
?????? TCHAR?szPathName[1024];
?????? SHGetPathFromIDList(pidl,szPathName);
?????? LPMALLOC?pMalloc;?
?????? SHGetMalloc(?&pMalloc?);
?????? pMalloc->Free(pidl);
????}?
????更換其中參數(shù)CSIDL_APPDATA,可以得到很多的系統(tǒng)設(shè)置值。用此方法,將前文所講的判定給了
API,不再有問(wèn)題。
posted @
2006-05-25 00:10 Jerry Cat 閱讀(776) |
評(píng)論 (0) |
編輯 收藏
MFC下的文件類
轉(zhuǎn)自
http://m.shnenglu.com/RancyGe/archive/2006/05/22/7496.html
1、文件操作的方法
?? 使用Visual C++編程,有如下方法進(jìn)行文件操作:
(1)使用標(biāo)準(zhǔn)C運(yùn)行庫(kù)函數(shù),包括fopen、fclose、fseek等。
(2)使用Win16下的文件和目錄操作函數(shù),如lopen、lclose、lseek等。不過(guò),在Win32下,這些函數(shù)主要是為了和Win16向后兼容。
(3)使用Win32下的文件和目錄操作函數(shù),如CreateFile,CopyFile,DeleteFile,F(xiàn)indNextFile,等等。
???????? Win32下,打開(kāi)和創(chuàng)建文件都由CreateFile完成,成功的話,得到一個(gè)Win32下的句柄,這不同于“C”的fopen返回的句柄。在Win16下,該句柄和C運(yùn)行庫(kù)文件操作函數(shù)相容。但在Win32下,“C”的文件操作函數(shù)不能使用該句柄,如果需要的話,可以使用函數(shù)_open_osfhandle從Win32句柄得到一個(gè)“C”文件函數(shù)可以使用的文件句柄。 關(guān)閉文件使用Win32的CloseHandle。 在Win32下,CreateFile可以操作的對(duì)象除了磁盤(pán)文件外,還包括設(shè)備文件如通訊端口、管道、控制臺(tái)輸入、郵件槽等等。
(4)使用CFile和其派生類進(jìn)行文件操作。CFile從CObject派生,其派生類包括操作文本文件的CStdioFile,操作內(nèi)存文件的CmemFile,等等。CFile是建立在Win32的文件操作體系的基礎(chǔ)上,它封裝了部分Win32文件操作函數(shù)。最好是使用CFile類(或派生類)的對(duì)象來(lái)操作文件,必要的話,可以從這些類派生自己的文件操作類。統(tǒng)一使用CFile的界面可以得到好的移植性。
2、文件操作的方法
MFC用一些類來(lái)封裝文件訪問(wèn)的Win32 API。以CFile為基礎(chǔ),從CFile派生出幾個(gè)類,如CStdioFile,CMemFile,MFC內(nèi)部使用的CMiororFile,等等。
2.1、CFile的結(jié)構(gòu)
2.1.1、CFile定義的枚舉類型
CFile類定義了一些和文件操作相關(guān)的枚舉類型,主要有四種:OpenFlags,Attribute,SeekPosition,hFileNull。下面,分別解釋這些枚舉類型。
OpenFlags
OpenFlags定義了13種文件訪問(wèn)和共享模式:
enum OpenFlags {
//第一(從右,下同)至第二位,打開(kāi)文件時(shí)訪問(wèn)模式,讀/寫(xiě)/讀寫(xiě)
modeRead = 0x0000,
modeWrite = 0x0001,
modeReadWrite = 0x0002,
shareCompat = 0x0000, //32位MFC中沒(méi)用
//第五到第七位,打開(kāi)文件時(shí)的共享模式
shareExclusive = 0x0010,//獨(dú)占方式,禁止其他進(jìn)程讀寫(xiě)
shareDenyWrite = 0x0020,//禁止其他進(jìn)程寫(xiě)
shareDenyRead = 0x0030,//禁止其他進(jìn)程讀
shareDenyNone = 0x0040,//允許其他進(jìn)程寫(xiě)
//第八位,打開(kāi)文件時(shí)的文件繼承方式
modeNoInherit = 0x0080,//不允許子進(jìn)程繼承
//第十三、十四位,是否創(chuàng)建新文件和創(chuàng)建方式
modeCreate = 0x1000,//創(chuàng)建新文件,文件長(zhǎng)度0
modeNoTruncate = 0x2000,//創(chuàng)建新文件時(shí)如文件已存在則打開(kāi)
//第十五、十六位,文件以二進(jìn)制或者文本方式打開(kāi),在派生類CStdioFile中用
typeText = 0x4000,
typeBinary = (int)0x8000
};
Attribute
Attribute定義了文件屬性:正常、只讀、隱含、系統(tǒng)文件,文件或者目錄等。
enum Attribute {
normal = 0x00,
readOnly = 0x01,
hidden = 0x02,
system = 0x04,
volume = 0x08,
directory = 0x10,
archive = 0x20
}
SeekPosition
SeekPosition定義了三種文件位置:頭、尾、當(dāng)前:
enum SeekPosition{
begin = 0x0,
current = 0x1,
end = 0x2
};
hFileNull
hFileNull定義了空文件句柄
enum { hFileNull = -1 };
2.1.2、CFile的其他一些成員變量
CFile除了定義枚舉類型,還定義了一些成員變量。例如:
UINT m_hFile
該成員變量是public訪問(wèn)屬性,保存::CreateFile返回的操作系統(tǒng)的文件句柄。MFC重載了運(yùn)算符號(hào)HFILE來(lái)返回m_hFile,這樣在使用HFILE類型變量的地方可以使用CFile對(duì)象。
BOOL m_bCloseOnDelete;
CString m_strFileName;
這兩個(gè)成員變量是protected訪問(wèn)屬性。m_bCloseOnDelete用來(lái)指示是否在關(guān)閉文件時(shí)刪除CFile對(duì)象;m_strFileName用來(lái)保存文件名。
2.1.3、CFile的成員函數(shù)
CFile的成員函數(shù)實(shí)現(xiàn)了對(duì)Win32文件操作函數(shù)的封裝,完成以下動(dòng)作:打開(kāi)、創(chuàng)建、關(guān)閉文件,文件指針定位,文件的鎖定與解鎖,文件狀態(tài)的讀取和修改,等等。其中,用到了m_hFile文件句柄的一般是虛擬函數(shù),和此無(wú)關(guān)的一般是靜態(tài)成員函數(shù)。一般地,成員函數(shù)被映射到對(duì)應(yīng)的Win32函數(shù),如表11-1所示。
??????? 表11-1 CFile函數(shù)對(duì)Win32文件函數(shù)的封裝
虛擬
|
靜態(tài)
|
成員函數(shù)
|
對(duì)應(yīng)的Win32函數(shù)
|
文件的創(chuàng)建、打開(kāi)、關(guān)閉
|
√
|
|
Abort
|
CloseHandle
|
√
|
|
Duplicate
|
DuplicateHandle
|
√
|
|
Open
|
CreateFile
|
√
|
|
Close
|
CloseHandle
|
文件的讀寫(xiě)
|
√
|
|
Read
|
ReadFile
|
|
|
ReadHuge(向后兼容)
|
調(diào)用Read成員函數(shù)
|
√
|
|
Write
|
WriteFile
|
|
|
WriteHuage(向后兼容)
|
調(diào)用Write成員函數(shù)
|
√
|
|
Flush
|
FlushFileBuffers
|
文件定位
|
√
|
|
Seek
|
SetFilePointer
|
|
|
SeekToBegin
|
調(diào)用Seek成員函數(shù)
|
|
|
SeekToEnd
|
調(diào)用Seek成員函數(shù)
|
√
|
|
GetLength
|
調(diào)用Seek成員函數(shù)
|
√
|
|
SetLength
|
SetEndOfFile
|
文件的鎖定/解鎖
|
√
|
|
LockRange
|
LockFile
|
√
|
|
UnlockRange
|
UnlockFile
|
文件狀態(tài)操作函數(shù)
|
√
|
|
GetPosition
|
SetFilePointer
|
|
|
GetStatus(CFileStatus&)
|
GetFileTime,GetFileSize等
|
|
√
|
GetStatus(LPSTR lpszFileName CFileStatus&)
|
FindFirstFile
|
√
|
|
GetFileName
|
不是簡(jiǎn)單地映射到某個(gè)函數(shù)
|
√
|
|
GetFileTitle
|
|
√
|
|
GetFilePath
|
|
√
|
|
SetFilePath
|
|
|
√
|
SetStatus
|
|
改名和刪除
|
|
√
|
Rename
|
MoveFile
|
|
√
|
Remove
|
DeleteFile
|
2.1.4、CFile的部分實(shí)現(xiàn)
這里主要討論CFile對(duì)象的構(gòu)造函數(shù)和文件的打開(kāi)/創(chuàng)建的過(guò)程。
構(gòu)造函數(shù)
CFile有如下幾個(gè)構(gòu)造函數(shù):
CFile()
缺省構(gòu)造函數(shù),僅僅構(gòu)造一個(gè)CFile對(duì)象,還必須使用Open成員函數(shù)來(lái)打開(kāi)文件。
CFile(int hFile)
已經(jīng)打開(kāi)了一個(gè)文件hFile,在此基礎(chǔ)上構(gòu)造一個(gè)CFile對(duì)象來(lái)給它打包。HFile將被賦值給CFile的成員變量m_hFile。
CFile(LPCTSTR lpszFileName, UINT nOpenFlags)
指定一個(gè)文件名和文件打開(kāi)方式,構(gòu)造CFile對(duì)象,調(diào)用Open打開(kāi)/創(chuàng)建文件,把文件句柄保存到m_hFile。
打開(kāi)/創(chuàng)建文件
Open的原型如下:
BOOL CFile::Open(LPCTSTR lpszFileName, UINT nOpenFlags,
CFileException* pException)
Open調(diào)用Win32函數(shù)::CreateFile打開(kāi)文件,并把文件句柄保存到成員變量m_hFile中。
CreateFile函數(shù)的原型如下:
HANDLE CreateFile(
?LPCTSTR lpFileName,?? // pointer to name of the file
?DWORD dwDesiredAccess,// access (read-write) mode
?DWORD dwShareMode,??? // share mode
?LPSECURITY_ATTRIBUTES lpSecurityAttributes, //pointer to security descriptor
?DWORD dwCreationDistribution,// how to create
?DWORD dwFlagsAndAttributes,? // file attributes
?HANDLE hTemplateFile???????? // handle to file with attributes to copy
);
顯然,Open必須把自己的兩個(gè)參數(shù)lpszFileName和nOpenFlags映射到CreateFile的七個(gè)參數(shù)上。
從OpenFlags的定義可以看出,(nOpenFlags & 3)表示了讀寫(xiě)標(biāo)識(shí),映射成變量dwAccess,可以取值為Win32的GENERIC_READ、GENERIC_WRITE、GENERIC_READ|GENERIC_WRITE。
(nOpenFlags & 0x70)表示了共享模式,映射成變量dwShareMode,可以取值為Win32的FILE_SHARE_READ、FILE_SHARE_WRITE、FILE_SHARE_WRITE|FILE_SHARE_READ。
Open定義了一個(gè)局部的SECURITY_ATTRIBUTES變量sa,(nOpenFlags & 0x80)被賦值給sa.bInheritHandle。
(nOpenFlags & modeCreate)表示了創(chuàng)建方式,映射成變量dwCreateFlag,可以取值為Win32的OPEN_ALWAYS、CREATE_ALWAYS、OPEN_EXISTING。
在生成了上述參數(shù)之后,先調(diào)用::CreateFile:
HANDLE hFile =::CreateFile(lpszFileName,
dwAccess, dwShareMode, &sa,
dwCreateFlag, FILE_ATTRIBUTE_NORMAL, NULL);
然后,hFile被賦值給成員變量m_hFile,m_bCloseOnDelete被設(shè)置為T(mén)RUE。
由上可以看出,CFile打開(kāi)(創(chuàng)建)一個(gè)文件時(shí)大大簡(jiǎn)化了:: CreateFile函數(shù)的復(fù)雜性,即只需要指定一個(gè)文件名、一個(gè)打開(kāi)文件的參數(shù)即可。若該參數(shù)指定為0,則表示以只讀方式打開(kāi)一個(gè)存在的文件,獨(dú)占使用,不允許子進(jìn)程繼承。
在CFile對(duì)象使用時(shí),如果它是在堆中分配的,則應(yīng)該銷毀它;如果在棧中分配的,則CFile對(duì)象將被自動(dòng)銷毀。銷毀時(shí)析構(gòu)函數(shù)被調(diào)用,析構(gòu)函數(shù)是虛擬函數(shù)。若m_bCloseOnDelete為真且m_hFile非空,則析構(gòu)函數(shù)調(diào)用Close關(guān)閉文件。
至于其他CFile成員函數(shù)的實(shí)現(xiàn),這里不作分析了。
2.1.5、CFile的派生類
這里主要簡(jiǎn)要地介紹CStdioFile和CmemFile及CFileFind。
CStdioFile
CStdioFile對(duì)文本文件進(jìn)行操作。
CStdioFile定義了新的成員變量m_pStream,類型是FILE*。在打開(kāi)或者創(chuàng)建文件時(shí),使用_open_osfhandle從m_hFile(Win32文件句柄)得到一個(gè)“C”的FILE類型的文件指針,然后,在文件操作中,使用“C”的文件操作函數(shù)。例如,讀文件使用_fread,而不是::ReadFile,寫(xiě)文件使用了_fwrite,而不是::WriteFile,等等。m_hFile是CFile的成員變量。
另外,CStdioFile不支持CFile的Dumplicate、LockRange、UnlockRange操作,但是實(shí)現(xiàn)了兩個(gè)新的操作ReadString和WriteString。
CMemFile
CMemFile把一塊內(nèi)存當(dāng)作一個(gè)文件來(lái)操作,所以,它沒(méi)有打開(kāi)文件的操作,而是設(shè)計(jì)了Attach和Detach用來(lái)分配或者釋放一塊內(nèi)存。相應(yīng)地,它提供了Alloc、Free虛擬函數(shù)來(lái)操作內(nèi)存文件,它覆蓋了Read、Write來(lái)讀寫(xiě)內(nèi)存文件。
CFileFind
為了方便文件查找,MFC把有關(guān)功能歸結(jié)成為一個(gè)類CFileFind。CFileFind派生于CObject類。首先,它使用FindFile和FineNextFile包裝了Win32函數(shù)::FindFirstFile和::FindNextFile;其次,它提供了許多函數(shù)用來(lái)獲取文件的狀態(tài)或者屬性。
使用CFileStatus結(jié)構(gòu)來(lái)描述文件的屬性,其定義如下:
struct CFileStatus
{
???????CTime m_ctime; // 文件創(chuàng)建時(shí)間
???????CTime m_mtime; // 文件最近一次修改時(shí)間
???????CTime m_atime; // 文件最近一次訪問(wèn)時(shí)間
???????LONG m_size; // 文件大小
???????BYTE m_attribute; // 文件屬性
???????BYTE _m_padding; // 沒(méi)有實(shí)際含義,用來(lái)增加一個(gè)字節(jié)
???????TCHAR m_szFullName[_MAX_PATH]; //絕對(duì)路徑
#ifdef _DEBUG
//實(shí)現(xiàn)Dump虛擬函數(shù),輸出文件屬性
void Dump(CDumpContext& dc) const;
#endif
};
例如:
CFileStatus status;
pFile->GetStatus(status);
#ifdef _DEBUG
status.dump(afxDump);
#endif
posted @
2006-05-23 21:17 Jerry Cat 閱讀(737) |
評(píng)論 (1) |
編輯 收藏
static_cast<>揭密
作者:Sam NG
譯者:
小刀人
原文鏈接:
What static_cast<> is actually doing?
本文討論static_cast<> 和 reinterpret_cast<>。
介紹
大多程序員在學(xué)C++前都學(xué)過(guò)C,并且習(xí)慣于C風(fēng)格(類型)轉(zhuǎn)換。當(dāng)寫(xiě)C++(程序)時(shí),有時(shí)候我們?cè)谑褂胹tatic_cast<>和reinterpret_cast<>時(shí)可能會(huì)有點(diǎn)模糊。在本文中,我將說(shuō)明static_cast<>實(shí)際上做了什么,并且指出一些將會(huì)導(dǎo)致錯(cuò)誤的情況。
泛型(Generic Types)
??????? float f = 12.3;
??????? float* pf = &f;
??????? // static cast<>
??????? // 成功編譯, n = 12
??????? int n = static_cast<int>(f);
??????? // 錯(cuò)誤,指向的類型是無(wú)關(guān)的(譯注:即指針變量pf是float類型,現(xiàn)在要被轉(zhuǎn)換為int類型)
??????? //int* pn = static_cast<int*>(pf);
??????? //成功編譯
??????? void* pv = static_cast<void*>(pf);
??????? //成功編譯, 但是 *pn2是無(wú)意義的內(nèi)存(rubbish)
??????? int* pn2 = static_cast<int*>(pv);// reinterpret_cast<>
??????? //錯(cuò)誤,編譯器知道你應(yīng)該調(diào)用static_cast<>
??????? //int i = reinterpret_cast<int>(f);
??????? //成功編譯, 但是 *pn 實(shí)際上是無(wú)意義的內(nèi)存,和 *pn2一樣
??????? int* pi = reinterpret_cast<int*>(pf);
簡(jiǎn)而言之,static_cast<> 將嘗試轉(zhuǎn)換,舉例來(lái)說(shuō),如float-到-integer,而reinterpret_cast<>簡(jiǎn)單改變編譯器的意圖重新考慮那個(gè)對(duì)象作為另一類型。
指針類型(Pointer Types)
指針轉(zhuǎn)換有點(diǎn)復(fù)雜,我們將在本文的剩余部分使用下面的類:
class CBaseX
????? {
????? public:
????? int x;
????? CBaseX() { x = 10; }
????? void foo() { printf("CBaseX::foo() x=%d\n", x); }
????? };
????? class CBaseY
??????? {
??????? public:
??????? int y;
??????? int* py;
??????? CBaseY() { y = 20; py = &y; }
??????? void bar() { printf("CBaseY::bar() y=%d, *py=%d\n", y, *py);
??????? }
??????? };class CDerived : public CBaseX, public CBaseY
??????? {
??????? public:
??????? int z;
??????? };
情況1:兩個(gè)無(wú)關(guān)的類之間的轉(zhuǎn)換
????? // Convert between CBaseX* and CBaseY*
????? // CBaseX* 和 CBaseY*之間的轉(zhuǎn)換
????? CBaseX* pX = new CBaseX();
????? // Error, types pointed to are unrelated
????? // 錯(cuò)誤, 類型指向是無(wú)關(guān)的
????? // CBaseY* pY1 = static_cast<CBaseY*>(pX);
????? // Compile OK, but pY2 is not CBaseX
????? // 成功編譯, 但是 pY2 不是CBaseX
????? CBaseY* pY2 = reinterpret_cast<CBaseY*>(pX);
????? // System crash!!
????? // 系統(tǒng)崩潰!!
????? // pY2->bar();
正如我們?cè)诜盒屠又兴J(rèn)識(shí)到的,如果你嘗試轉(zhuǎn)換一個(gè)對(duì)象到另一個(gè)無(wú)關(guān)的類static_cast<>將失敗,而reinterpret_cast<>就總是成功“欺騙”編譯器:那個(gè)對(duì)象就是那個(gè)無(wú)關(guān)類。
情況2:轉(zhuǎn)換到相關(guān)的類
????? 1. CDerived* pD = new CDerived();
????? 2. printf("CDerived* pD = %x\n", (int)pD);
????? 3.
????? 4. // static_cast<> CDerived* -> CBaseY* -> CDerived*
????? //成功編譯,隱式static_cast<>轉(zhuǎn)換
????? 5. CBaseY* pY1 = pD;
????? 6. printf("CBaseY* pY1 = %x\n", (int)pY1);
????? // 成功編譯, 現(xiàn)在 pD1 = pD
????? 7. CDerived* pD1 = static_cast<CDerived*>(pY1);
????? 8. printf("CDerived* pD1 = %x\n", (int)pD1);
????? 9.
????? 10. // reinterpret_cast
????? // 成功編譯, 但是 pY2 不是 CBaseY*
????? 11. CBaseY* pY2 = reinterpret_cast<CBaseY*>(pD);
????? 12. printf("CBaseY* pY2 = %x\n", (int)pY2);
????? 13.
????? 14. // 無(wú)關(guān)的 static_cast<>
????? 15. CBaseY* pY3 = new CBaseY();
????? 16. printf("CBaseY* pY3 = %x\n", (int)pY3);
????? // 成功編譯,盡管 pY3 只是一個(gè) "新 CBaseY()"
????? 17. CDerived* pD3 = static_cast<CDerived*>(pY3);
????? 18. printf("CDerived* pD3 = %x\n", (int)pD3);
????? ---------------------- 輸出 ---------------------------
????? CDerived* pD = 392fb8
????? CBaseY* pY1 = 392fbc
????? CDerived* pD1 = 392fb8
????? CBaseY* pY2 = 392fb8
????? CBaseY* pY3 = 390ff0
????? CDerived* pD3 = 390fec
注意:在將CDerived*用隱式 static_cast<>轉(zhuǎn)換到CBaseY*(第5行)時(shí),結(jié)果是(指向)CDerived*(的指針向后) 偏移了4(個(gè)字節(jié))(譯注:4為int類型在內(nèi)存中所占字節(jié)數(shù))。為了知道static_cast<> 實(shí)際如何,我們不得不要來(lái)看一下CDerived的內(nèi)存布局。?
CDerived的內(nèi)存布局(Memory Layout)
如圖所示,CDerived的內(nèi)存布局包括兩個(gè)對(duì)象,CBaseX 和 CBaseY,編譯器也知道這一點(diǎn)。因此,當(dāng)你將CDerived* 轉(zhuǎn)換到 CBaseY*時(shí),它給指針添加4個(gè)字節(jié),同時(shí)當(dāng)你將CBaseY*轉(zhuǎn)換到CDerived*時(shí),它給指針減去4。然而,甚至它即便不是一個(gè)CDerived你也可以這樣做。
當(dāng)然,這個(gè)問(wèn)題只在如果你做了多繼承時(shí)發(fā)生。在你將CDerived轉(zhuǎn)換 到 CBaseX時(shí)static_cast<> 和 reinterpret_cast<>是沒(méi)有區(qū)別的。
情況3:void*之間的向前和向后轉(zhuǎn)換
因?yàn)槿魏沃羔樋梢员晦D(zhuǎn)換到void*,而void*可以被向后轉(zhuǎn)換到任何指針(對(duì)于static_cast<> 和 reinterpret_cast<>轉(zhuǎn)換都可以這樣做),如果沒(méi)有小心處理的話錯(cuò)誤可能發(fā)生。
??????? CDerived* pD = new CDerived();
??????? printf("CDerived* pD = %x\n", (int)pD);
??????? CBaseY* pY = pD; // 成功編譯, pY = pD + 4
??????? printf("CBaseY* pY = %x\n", (int)pY);
??????? void* pV1 = pY; //成功編譯, pV1 = pY
??????? printf("void* pV1 = %x\n", (int)pV1);
??????? // pD2 = pY, 但是我們預(yù)期 pD2 = pY - 4
??????? CDerived* pD2 = static_cast<CDerived*>(pV1);
??????? printf("CDerived* pD2 = %x\n", (int)pD2);
??????? // 系統(tǒng)崩潰
??????? // pD2->bar();
??????? ---------------------- 輸出 ---------------------------
??????? CDerived* pD = 392fb8
??????? CBaseY* pY = 392fbc
??????? void* pV1 = 392fbc
??????? CDerived* pD2 = 392fbc
一旦我們已經(jīng)轉(zhuǎn)換指針為void*,我們就不能輕易將其轉(zhuǎn)換回原類。在上面的例子中,從一個(gè)void* 返回CDerived*的唯一方法是將其轉(zhuǎn)換為CBaseY*然后再轉(zhuǎn)換為CDerived*。
但是如果我們不能確定它是CBaseY* 還是 CDerived*,這時(shí)我們不得不用dynamic_cast<> 或typeid[2]。
注釋:
1. dynamic_cast<>,從另一方面來(lái)說(shuō),可以防止一個(gè)泛型CBaseY* 被轉(zhuǎn)換到CDerived*。
2. dynamic_cast<>需要類成為多態(tài),即包括“虛”函數(shù),并因此而不能成為void*。
參考:
1. [MSDN] C++ Language Reference -- Casting
2. Nishant Sivakumar, Casting Basics - Use C++ casts in your VC++.NET programs
3. Juan Soulie, C++ Language Tutorial: Type Casting
posted @
2006-05-23 01:45 Jerry Cat 閱讀(446) |
評(píng)論 (0) |
編輯 收藏
WINXP服務(wù)詳解
1.Alerter
Alerter(警示器)服務(wù)的進(jìn)程名是 Services.exe(即啟動(dòng)這個(gè)服務(wù)后在后臺(tái)運(yùn)行的進(jìn)程的名稱,可以通過(guò)任務(wù)管理器看到)。Alerter服務(wù)的功能是,WinXP將系統(tǒng)上發(fā)生的 與管理有關(guān)的事件以警示(Alert)信息傳送至網(wǎng)絡(luò)上指定的電腦或用戶,例如當(dāng)發(fā)生打印錯(cuò)誤或硬盤(pán)即將寫(xiě)滿等事件,這類警示信息由XP的警示器服務(wù) (Alerter Service)收集、送出。
盡管Alerter依存的服務(wù)并沒(méi)有Messenger(信使)服務(wù),但Alerter服 務(wù)必須依賴后者才能送出信息,故在啟動(dòng)Alerter服務(wù)后還必須確定Messenger服務(wù)也是在工作中,而接收的電腦也必須啟動(dòng)Messenger服 務(wù)。由于Alerter服務(wù)運(yùn)行后,服務(wù)使用戶可以發(fā)送彈出(Pop-up)信息給其他用戶,這些信息有可能被攻擊者用來(lái)實(shí)施攻擊,如誘騙用戶修改口令 等,從而造成安全隱患。同時(shí)該服務(wù)使得用戶帳號(hào)名泄漏,也有可能被攻擊者利用來(lái)進(jìn)行口令猜測(cè)攻擊。所以對(duì)于家庭單機(jī)用戶,甚至對(duì)于絕大多數(shù)小型的局域網(wǎng)來(lái) 說(shuō),這個(gè)功能是完全可禁用的,不僅節(jié)省了系統(tǒng)資源和加快啟動(dòng)速度,也提高了機(jī)器的安全性。
2.Application Layer Gateway Service
簡(jiǎn)稱"ALG"(應(yīng)用層網(wǎng)關(guān)),其進(jìn)程名是alg.exe,WinXP Home/PRO默認(rèn)安裝的啟動(dòng)類型為手動(dòng)。ALG又被稱為代理服務(wù)器(Proxy Server),是網(wǎng)絡(luò)防火墻從功能面上分類的一種。當(dāng)內(nèi)部計(jì)算機(jī)與外部主機(jī)連結(jié)時(shí),將由代理服務(wù)器(Proxy Server)擔(dān)任內(nèi)部計(jì)算機(jī)與外部主機(jī)的連結(jié)中繼者。使用ALG的好處是隱藏內(nèi)部主機(jī)的地址和防止外部不正常的連接,如果代理服務(wù)器上未安裝針對(duì)該應(yīng)用 程序設(shè)計(jì)的代理程序時(shí),任何屬于這個(gè)網(wǎng)絡(luò)服務(wù)的封包將完全無(wú)法通過(guò)防火墻。通俗點(diǎn)說(shuō),具體到ALG本身,它就是WinXP附帶的Internet連接共享 /防火墻的具體控管程序,如果你需要啟用這二者,這個(gè)服務(wù)是必備的。當(dāng)然,只有一臺(tái)計(jì)算機(jī)的上網(wǎng)家庭可以考慮禁用這個(gè)服務(wù),不過(guò)筆者個(gè)人覺(jué)得WinXP內(nèi) 置的防火墻效果還是不錯(cuò)的,如果不是堅(jiān)持要使用第三方的防火墻,還是建議開(kāi)著它吧。
3.Application Management
AppMgmt (應(yīng)用程序管理服務(wù))的進(jìn)程名是Svchost.exe,WinXP Home/Pro默認(rèn)安裝的啟動(dòng)類型是手動(dòng),沒(méi)有任何依存服務(wù)關(guān)系。從Win2000開(kāi)始微軟引入了一種基于MSI文件格式(應(yīng)用程序安裝信息程序包文 件)的全新、有效軟件管理方案——即應(yīng)用程序管理組件服務(wù)(Application Management),它不僅管理軟件的安裝、刪除,而且可使用此項(xiàng)服務(wù)修改、修復(fù)現(xiàn)有應(yīng)用程序,監(jiān)視文件復(fù)原并通過(guò)復(fù)原排除基本故障等。通常這個(gè)服務(wù) 我們保持其默認(rèn)狀態(tài)較好。
可能許多朋友都有印象,當(dāng)年ACDSee 4.0剛發(fā)布時(shí),由于安裝制作上的考慮不周,并沒(méi)有考慮到那個(gè)時(shí)候大多數(shù)人的系統(tǒng)還并不支持MSI安裝格式,結(jié)果只得又去下載安裝一個(gè)名為Windows Installer的MSI輔助文件才解決問(wèn)題。通常以MSI文件格式安裝的軟件十分好認(rèn),比如說(shuō)Office XP,當(dāng)你安裝后再次運(yùn)行軟件的安裝程序時(shí),它一般會(huì)有"重新安裝"、"修復(fù)軟件"、"卸載軟件"等多個(gè)選項(xiàng),而不是以前安裝程序那種就簡(jiǎn)單的卸載或覆蓋 安裝了事。
4.Automatic Updates
Wuauserv(自動(dòng)更新服務(wù))的進(jìn)程名是Svchost.exe,WinXP Home/Pro默認(rèn)安裝的啟動(dòng)類型為自動(dòng),沒(méi)有任何依存服務(wù)關(guān)系。這個(gè)是大家都非常熟悉的系統(tǒng)自動(dòng)更新功能,就不多說(shuō)了。用小貓上網(wǎng)而深受其苦的朋友記 得在系統(tǒng)屬性中關(guān)閉是不夠的,還要將Automatic Updates這個(gè)服務(wù)禁用才可以。以后需要更新的話,直接到在IE中鍵入Windows Update 網(wǎng)站地址手動(dòng)更新即可。
5.Background Intelligent Transfer Service
BITS(后臺(tái)智能傳輸服務(wù))的進(jìn)程名是Svchost.exe,WinXP Home/Pro默認(rèn)安裝的啟動(dòng)類型是手動(dòng),依賴于Remote Procedure Call、Workstation服務(wù)。微軟宣稱BITS能夠利用剩余的帶寬傳輸文件,當(dāng)網(wǎng)絡(luò)切斷或計(jì)算機(jī)需重啟時(shí),后臺(tái)智能傳輸服務(wù)會(huì)自動(dòng)對(duì)文件傳輸加 以維護(hù),當(dāng)網(wǎng)絡(luò)重新連接時(shí),后臺(tái)智能傳輸服務(wù)將繼續(xù)從停止的地方繼續(xù)開(kāi)始傳輸文件。其實(shí)這個(gè)服務(wù)原是用來(lái)實(shí)現(xiàn)HTTP 1.1服務(wù)器之間的信息傳輸,基本上它的應(yīng)用也就是支持Windows自動(dòng)更新時(shí)的斷點(diǎn)續(xù)傳。如果你禁用了Automatic Updates,留著它基本上也沒(méi)有什么意義。
6.ClipBook
ClipSrv(剪貼板查看器服務(wù))的進(jìn)程名是 clipsrv.exe,WinXP Home/Pro默認(rèn)安裝的啟動(dòng)類型是手動(dòng),依賴Network DDE服務(wù)。ClipBook通過(guò)Network DDE和Network DDE DSDM提供的網(wǎng)絡(luò)動(dòng)態(tài)數(shù)據(jù)交換服務(wù),可查閱遠(yuǎn)程機(jī)器中的剪貼板,通俗的說(shuō)就是ClipBook支持剪貼板查看器(ClipBook Viewer)程序,該程序可允許剪貼頁(yè)被遠(yuǎn)程計(jì)算機(jī)上的ClipBook瀏覽。
例如有個(gè)較大的文檔工程,由A、B、C共同開(kāi)發(fā),A負(fù)責(zé) Excel數(shù)據(jù)部分,B負(fù)責(zé)Visio制圖部分,而C負(fù)責(zé)將兩部分文檔的整合。C經(jīng)常需要對(duì)A、B的數(shù)據(jù)進(jìn)行拷貝,愚蠢的做法是C打開(kāi)A、B在網(wǎng)絡(luò)鄰居上 共享的文檔,然后將相關(guān)內(nèi)容拷貝。而對(duì)Windows體系有一定了解的用戶應(yīng)該聽(tīng)說(shuō)過(guò)OLE這個(gè)東西,上面說(shuō)的EXCEL數(shù)據(jù)和Visio制圖都可以認(rèn)為 是獨(dú)立的OLE對(duì)象,如果A、B、C的3臺(tái)機(jī)器上的Clipbook服務(wù)都為開(kāi)啟,就可利用ClipBook共享這些OLE對(duì)象,C只要在自己的文檔中建 立OLE對(duì)象的鏈接指向A、B的Excel和Visio,A、B對(duì)自己工作的任何改動(dòng)即可在C的復(fù)合文檔里自動(dòng)體現(xiàn)。由此可見(jiàn),ClipBook是基于對(duì) 象的共享,而非簡(jiǎn)單的文件共享。所以也很好理解,這是一把雙刃劍,在帶來(lái)極大方便的同時(shí),也帶來(lái)被非法遠(yuǎn)程訪問(wèn)ClipBook剪貼頁(yè)面的安全隱患。對(duì)于 沒(méi)有上述類似工作,又不準(zhǔn)備使用或極少使用遠(yuǎn)程桌面的用戶,這個(gè)服務(wù)完全可以禁用,在需要的時(shí)候再打開(kāi)。
7.COM+ Event System
EventSystem (COM+事件系統(tǒng)服務(wù))的進(jìn)程名是Svchost.exe,WinXP Home/Pro默認(rèn)安裝的啟動(dòng)類型是手動(dòng),依賴Remote Procedure Call服務(wù)。對(duì)于非軟件開(kāi)發(fā)專業(yè)的朋友來(lái)說(shuō),COM+是個(gè)非常難理解的名詞。簡(jiǎn)單的說(shuō)COM+是一種軟件構(gòu)件/組件的標(biāo)準(zhǔn)。比如寫(xiě)一個(gè)軟件好比是蓋一座 房子。而門(mén)窗等部件會(huì)根據(jù)標(biāo)準(zhǔn)設(shè)計(jì),以求得省時(shí)省力,COM組件即是Windows的門(mén)窗等標(biāo)準(zhǔn)組件了,COM+是對(duì)COM的進(jìn)一步擴(kuò)展,其具體含義在此 就不詳細(xì)介紹了,Windows系統(tǒng)又是個(gè)典型的消息(事件)處理型系統(tǒng),很多功能都是由消息來(lái)觸發(fā)的,這就產(chǎn)生了COM+ Event System。我們要學(xué)習(xí)的是如何簡(jiǎn)單判斷自己的系統(tǒng)中是否有程序依靠此服務(wù)。檢查你的系統(tǒng)安裝盤(pán)下的"Program files\ComPlus Applications "目錄,如果沒(méi)有東西就可以把這個(gè)服務(wù)關(guān)閉了。
8.COM+ System Application
COMSysApp(COM+系統(tǒng)應(yīng)用服務(wù))的進(jìn)程名是Dllhost.exe,WinXP Home/Pro默認(rèn)安裝的啟動(dòng)類型是手動(dòng),依賴Remote Procedure Call服務(wù)。簡(jiǎn)單的說(shuō),COM+ System Application是COM+ Event System的具體執(zhí)行者,如果禁用了COM+ Event System也就自然禁用它。
9.Computer Browser
Browser(計(jì)算機(jī)瀏覽器服務(wù))的進(jìn)程名是Svchost.exe,WinXP Home/Pro默認(rèn)安裝的啟動(dòng)類型是自動(dòng),依賴Server和Workstation服務(wù)。Browser服務(wù)維護(hù)著一個(gè)網(wǎng)絡(luò)資源的清單,其中包括基于 Windows的域、工作組和計(jì)算機(jī),還有其他支持NetBIOS協(xié)議的網(wǎng)絡(luò)設(shè)備,我們?cè)?網(wǎng)上鄰居"上看到顯示的內(nèi)容正是來(lái)源于此。顯然對(duì)于一般家庭用 的計(jì)算機(jī)這個(gè)服務(wù)并不需要,除非計(jì)算機(jī)位于局域網(wǎng)之上,例如用長(zhǎng)城寬帶的朋友,用它可方便地知道社區(qū)內(nèi)的網(wǎng)絡(luò)環(huán)境。這個(gè)服務(wù)還是慎重對(duì)待較好,若不是太在 意還是將其設(shè)置成自動(dòng)吧。
10.Cryptographic services
CryptSvc(認(rèn)證服務(wù))的進(jìn)程名是 Svchost.exe,WinXP Home/Pro默認(rèn)安裝的啟動(dòng)類型為自動(dòng),依賴Remote Procedure Call服務(wù)。CryptSvc是整個(gè)微軟公鑰體系(PKI,Public Key Infrastructure)的核心元件。所謂的PK是一種公匙加密法,通過(guò)加密來(lái)保證數(shù)據(jù)的安全和傳送,它與傳統(tǒng)的秘密(對(duì)稱)鑰匙密碼法不相同, PK密碼法的基本特性是加密和解密的鑰匙不同,每一個(gè)用戶兩把鑰匙,一把公開(kāi)密匙,一把私匙。撇開(kāi)這些難以一下子理解的術(shù)語(yǔ),具體到CryptSvc本身 來(lái)說(shuō),如果我們?cè)赪inXP中使用Automatic Updates自動(dòng)更新,或在Internet上使用證書(shū)進(jìn)行身份驗(yàn)證以及正確管理這些證書(shū)等,那么這個(gè)服務(wù)就不要關(guān)閉。其中這個(gè)功能最有用的是,當(dāng)你安 裝一個(gè)驅(qū)動(dòng)程序時(shí),以確定它是不是通過(guò)微軟認(rèn)證的。因?yàn)轵?qū)動(dòng)程序在操作系統(tǒng)內(nèi)可以獲得很高的運(yùn)行權(quán)限,含有惡意代碼的驅(qū)動(dòng)程序會(huì)讓你玩完,因而開(kāi)發(fā)驅(qū)動(dòng)程 序的廠家一般都會(huì)去做微軟認(rèn)證,通過(guò)驗(yàn)證后,微軟會(huì)在里面添加它的認(rèn)證數(shù)據(jù),再到你機(jī)器上安裝時(shí)就可以通過(guò)CryptSvc檢測(cè)升級(jí)。
11.DHCP Client
Dhcp(DHCP客戶端服務(wù))的進(jìn)程名是 Svchost.exe,WinXP Home/Pro默認(rèn)安裝的啟動(dòng)類型為自動(dòng),依賴AFD Networking Support Environment、NetBIOS over TCP/IP以及TCP/IP Protocol Driver服務(wù)。簡(jiǎn)單的說(shuō)DHCP過(guò)程就是由網(wǎng)絡(luò)中一臺(tái)主機(jī)(DHCP Server)將所有的網(wǎng)絡(luò)參數(shù)自動(dòng)分配給網(wǎng)絡(luò)內(nèi)的任何一臺(tái)計(jì)算機(jī),而DHCP Client就是網(wǎng)絡(luò)中被分配網(wǎng)絡(luò)參數(shù)的對(duì)象計(jì)算機(jī)了。如果能在網(wǎng)絡(luò)中被自動(dòng)分配IP地址等網(wǎng)絡(luò)參數(shù),那么這個(gè)DHCP Client服務(wù)就必不可少。對(duì)于家庭單機(jī)用戶來(lái)說(shuō),只要是使用DSL/Cable上網(wǎng)、開(kāi)啟ICS和IPSEC服務(wù)的人都需要這個(gè)來(lái)指定靜態(tài)IP,所以 通常這個(gè)服務(wù)是不關(guān)閉的,除非你的機(jī)器是完全的單機(jī)應(yīng)用環(huán)境。
12.Distributed Link Tracking Client
TrkWks(分布式連結(jié)追蹤客戶端服務(wù))的進(jìn)程名是Svchost.exe,WinXP Home/Pro默認(rèn)安裝的啟動(dòng)類型為自動(dòng),依賴Remote Procedure Call服務(wù)。對(duì)于計(jì)算機(jī)有一定了解的人對(duì)于"分布式"這個(gè)詞并不陌生,這里就不作解釋。TrkWks服務(wù)簡(jiǎn)單說(shuō),就是將整個(gè)網(wǎng)絡(luò)中分散于各臺(tái)計(jì)算機(jī)上互 相有連接的NTFS文件看作一個(gè)整體,相當(dāng)于一臺(tái)機(jī)器上的文件系統(tǒng),所以當(dāng)系統(tǒng)內(nèi)發(fā)生文件移動(dòng),就會(huì)記錄這個(gè)信息。它是針對(duì)"域用戶"的"NTFS文件" 的"分布式連接",這3個(gè)條件缺一個(gè)你就用不上它,對(duì)于不在局域網(wǎng)的單機(jī)用戶來(lái)說(shuō),當(dāng)然是禁用它。
13.Distributed Transaction coordinator
MSDTC(分布式交易協(xié)調(diào)器)的進(jìn)程名是Msdtc.exe,WinXP Home/Pro默認(rèn)安裝的啟動(dòng)類型是手動(dòng),依賴Remote Procedure Call和Security Accounts Manager服務(wù)。MSDTC主要用來(lái)處理分布式交易,所謂分布式交易,就是跨越兩個(gè)或多個(gè)數(shù)據(jù)庫(kù)的單一SQL Server內(nèi)部的交易。同一數(shù)據(jù)庫(kù)內(nèi)不同數(shù)據(jù)表間的交易,則不能稱作分布式交易。顯然對(duì)于需要同時(shí)處理多個(gè)數(shù)據(jù)庫(kù)或文件系統(tǒng)的用戶來(lái)說(shuō),這個(gè)服務(wù)意義重 大,但它也是通常意義上一般用戶不會(huì)使用到的服務(wù),通常來(lái)默認(rèn)手動(dòng)啟動(dòng)就好了,其實(shí)這個(gè)服務(wù)也容易受到遠(yuǎn)程拒絕服務(wù)攻擊,禁用它也沒(méi)有問(wèn)題,而且更安全。
14.DNS Client
Dnscache(DNS客戶端服務(wù))的進(jìn)程名是Svchost.exe,WinXP Home/Pro默認(rèn)安裝的啟動(dòng)類型為自動(dòng),依賴TCP/IP Protocol Driver服務(wù)。DNS(Domain Name System)也是常見(jiàn)的名詞了,簡(jiǎn)單的解釋就是當(dāng)使用網(wǎng)頁(yè)瀏覽器去上網(wǎng)時(shí),會(huì)鍵入網(wǎng)站的網(wǎng)址,而這些網(wǎng)址名稱在因特網(wǎng)上就是透過(guò)網(wǎng)域名稱服務(wù)器(DNS 服務(wù)器)來(lái)完成名稱轉(zhuǎn)換為IP地址的解釋。實(shí)際上一些網(wǎng)站并不是只有一臺(tái)服務(wù)器在工作,而是有多臺(tái)服務(wù)器在同時(shí)工作,也就是說(shuō)同樣一個(gè)網(wǎng)站名稱地址可對(duì)應(yīng) 不同的IP地址(在Win2000以前的操作系統(tǒng)可執(zhí)行此查詢)。但如果將操作系統(tǒng)換到Win2000或XP,同樣的網(wǎng)站你又會(huì)發(fā)現(xiàn)總是查到同一個(gè)IP地 址。為什么會(huì)這樣呢?這就是DNS Client服務(wù)的作用。
為了要達(dá)到用最快速、最有效率的方式,讓客戶端能夠迅速找到網(wǎng)域的驗(yàn)證服務(wù),在Win2000/XP系統(tǒng)中,加入了DNS快取(Cache)的功能,當(dāng)?shù)?一次在找到了目的主機(jī)的IP地址后,操作系統(tǒng)就會(huì)將所查詢到的名稱及IP地址記錄在本機(jī)的DNS快取緩沖區(qū)中,下次客戶端還需要再查詢時(shí),就不需要到 DNS服務(wù)器上查詢,而直接使用本機(jī)DNS Cache中的數(shù)據(jù)即可,所以你查詢的結(jié)果始終是同一IP地址。這個(gè)服務(wù)關(guān)閉與否影響并不大,在安全性上最多只是可以泄漏你的緩存內(nèi)容,確定你曾經(jīng)訪問(wèn)過(guò) 的網(wǎng)站。
15.Error Reporting Service
ERSvc(錯(cuò)誤報(bào)告服務(wù))的進(jìn)程名是Svchost.exe,WinXP Home/Pro默認(rèn)安裝的啟動(dòng)類型為自動(dòng),依賴Remote Procedure Call服務(wù)。這個(gè)服務(wù)我們經(jīng)常碰到,當(dāng)使用程序出錯(cuò)時(shí)會(huì)跳出對(duì)話框,問(wèn)你是否需要向微軟發(fā)送報(bào)告,就是這個(gè)服務(wù)的功能。此服務(wù)完全可設(shè)置為手動(dòng)或禁止。 如果你想對(duì)錯(cuò)誤報(bào)告進(jìn)行更詳細(xì)的設(shè)置,可以右鍵單擊"我的電腦"圖標(biāo),選擇"屬性",在"高級(jí)選項(xiàng)卡"下點(diǎn)擊"錯(cuò)誤報(bào)告"按鈕,在那里你可以決定是否發(fā)送 錯(cuò)誤報(bào)告以及發(fā)送怎樣的錯(cuò)誤報(bào)告。而對(duì)于沒(méi)有上網(wǎng)的用戶就可直接禁用此服務(wù)了,上網(wǎng)用戶如果擔(dān)心報(bào)告會(huì)向微軟透漏你的私人信息(當(dāng)然微軟保證不會(huì)發(fā)生這種 事情),也大可禁用它。
16.Event Log
Eventlog(系統(tǒng)日志紀(jì)錄服務(wù))的進(jìn)程名是 Services.exe,WinXP Home/Pro默認(rèn)安裝的啟動(dòng)類型為自動(dòng),沒(méi)有服務(wù)依存關(guān)系。Event Log服務(wù)負(fù)責(zé)記錄來(lái)自系統(tǒng)和運(yùn)行中程序的管理事件消息,為Windows和應(yīng)用程序提供了一個(gè)標(biāo)準(zhǔn)而集中的方法來(lái)記錄重要的軟件和硬件事件。打開(kāi)事件查 看器的方法是依次打開(kāi)"開(kāi)始→控制面板",然后選擇打開(kāi)"管理工具→事件查看器"。這個(gè)服務(wù)是基礎(chǔ)服務(wù),無(wú)法調(diào)整關(guān)閉。
17.Fast User Switching Compatibility
Fast User Switching Compatibility(多用戶快速切換服務(wù))的進(jìn)程名是svchost.exe,WinXP Home/Pro默認(rèn)安裝的啟動(dòng)類型是手動(dòng),依賴Terminal Services服務(wù)。此服務(wù)是WinXP的新技術(shù),即快速的多用戶切換環(huán)境。解決了以前的多用戶環(huán)境雖然安全但是切換用戶環(huán)境需要重新啟動(dòng),并丟失上一 用戶工作環(huán)境的問(wèn)題。使用很簡(jiǎn)單,只要進(jìn)行"開(kāi)始→注銷→切換用戶"操作即可方便地切換用戶環(huán)境,是非常不錯(cuò)的多用戶技術(shù),如果用不著多用戶環(huán)境就不用打 開(kāi)它(加入域后默認(rèn)不能進(jìn)行快速切換,當(dāng)然可禁用)。
18.FAX Service
FAX(傳真服務(wù))的進(jìn)程名是 Fxssvc.exe,WinXP Home/Pro中默認(rèn)是沒(méi)有安裝的,依賴Plug and Play、Print Spooler、Remote Procedure Call、Telephony服務(wù)。FAX服務(wù)在默認(rèn)情況下是沒(méi)有安裝的,但如果你安裝了它就可以進(jìn)行"開(kāi)始→所有程序→附件→通訊→傳真"操作,使用 WinXP內(nèi)置的傳真服務(wù)來(lái)收發(fā)傳真了,當(dāng)然你要保證你的機(jī)器至少還保留了一只小貓。不需要的人就禁用吧。?
19.Help and Support
Helpsvc (幫助服務(wù))的進(jìn)程名是Svchost.exe,WinXP Home/Pro中默認(rèn)安裝的啟動(dòng)類型為自動(dòng),依賴Remote Procedure Call服務(wù)。這個(gè)服務(wù)用于支持WinXP幫助和支持中心的功能,如果你剛開(kāi)始使用WinXP,這個(gè)幫助中心能解決不少問(wèn)題,如果你覺(jué)得不需要它了,那就 禁用吧。
20.Human Interface Device Access
HidServ(人性化接口裝置服務(wù))的進(jìn)程名是 Svchost.exe,WinXP Home/Pro中默認(rèn)安裝的啟動(dòng)類型是禁用,依賴Remote Procedure Call服務(wù)。這個(gè)服務(wù)簡(jiǎn)單說(shuō)就是支持那些所謂的帶有多媒體功能智能鍵盤(pán),比如音量調(diào)節(jié)。當(dāng)然你有符合人體工程學(xué)標(biāo)準(zhǔn)的設(shè)備(主要指鍵盤(pán)和鼠標(biāo)),那么這 個(gè)服務(wù)就設(shè)置為自動(dòng),否則這些設(shè)備的一些功能將不能正常使用。而如果你沒(méi)有這類設(shè)備或者你的設(shè)備有自己的驅(qū)動(dòng),即可禁用此服務(wù)。
21.IMAPI CD-Burning COM Service
ImapiService(IMAPI CD刻錄服務(wù))的進(jìn)程名是Imapi.exe,WinXP Home/Pro中默認(rèn)安裝的啟動(dòng)類型是手動(dòng),沒(méi)有任何的服務(wù)依存關(guān)系。這個(gè)就是WinXP內(nèi)置的CD刻錄服務(wù)了,雜志2003年第12期對(duì)此有過(guò)較詳細(xì) 的介紹。總的來(lái)說(shuō)該服務(wù)的功能和性能十分有限,有刻錄機(jī)的朋友還是安裝成熟的第三方刻錄軟件,關(guān)閉這個(gè)服務(wù)吧。
22.Indexing Service
Cisvc (索引服務(wù))的進(jìn)程名是Cisvc.exe,WinXP Home/Pro中默認(rèn)安裝的啟動(dòng)類型是手動(dòng),依賴Remote Procedure Call服務(wù)。這個(gè)服務(wù)可為本地和遠(yuǎn)程計(jì)算機(jī)上的文件編制索引,也就是說(shuō)像圖書(shū)館里為圖書(shū)編制的查詢索引一樣,這樣可加快尋找文件的速度。開(kāi)啟此項(xiàng)服務(wù)對(duì) 個(gè)人用戶而言有一個(gè)很大的幫助,就是文件瀏覽速度(即雙擊某文件夾后的等待時(shí)間)會(huì)明顯增加,因?yàn)橄到y(tǒng)已將目錄結(jié)構(gòu)讀入了內(nèi)存,需要時(shí)會(huì)直接調(diào)用。但此服 務(wù)啟用后某此情況會(huì)導(dǎo)致系統(tǒng)極度繁忙,通過(guò)任務(wù)管理器,可看見(jiàn)Cidaemon.exe這個(gè)進(jìn)程占用了大部分CPU資源。因此對(duì)待這個(gè)不成熟的服務(wù)請(qǐng)根據(jù) 自己機(jī)器的情況設(shè)為"自動(dòng)"或"禁用"。
23.Internet Connection Firewall/Internet Connection Sharing
SharedAccess (Internet連接共享和防火墻服務(wù))的進(jìn)程名是Svchost.exe,WinXP Home/Pro中默認(rèn)安裝的啟動(dòng)類型分別是手動(dòng)和自動(dòng),依賴Application Layer Gateway Service、Network Connections、Network Location Awareness、Remote Access Connection Manager服務(wù)。這個(gè)服務(wù)提供WinXP內(nèi)置的Internet連接共享和防火墻功能。筆者比較喜歡這兩個(gè)功能,性能都不錯(cuò)而且方便,具體關(guān)閉與否看 個(gè)人喜好,不用就可以關(guān)閉它。
24.IPSEC Services
PolicyAgent(IP安全策略服務(wù))的進(jìn)程名是 Lsass.exe,WinXP Home/Pro中默認(rèn)安裝的啟動(dòng)類型為自動(dòng),依賴IPSEC driver、Remote Procedure Call、TCP/IP Protocol Driver服務(wù)。IPSEC是一種用來(lái)保護(hù)內(nèi)部網(wǎng)、專用網(wǎng)絡(luò)以及外部網(wǎng)(Internet、Extranet)免遭攻擊的重要防御方法,主要特征在于它 可對(duì)所有IP級(jí)的通信進(jìn)行加密和認(rèn)證,正是這一點(diǎn)才使IPSEC可以確保包括遠(yuǎn)程登錄、客戶/服務(wù)器、電子郵件、文件傳輸及Web訪問(wèn)在內(nèi)的多種應(yīng)用程序 的安全。由于企業(yè)及政府用戶非常注重于部署安全的IP,所以這一服務(wù)顯得很重要。同時(shí)也可以看到,對(duì)于絕大多數(shù)用戶來(lái)說(shuō),這是個(gè)根本就不用關(guān)心的東西。所 以禁用它吧。
25.Logical Disk Manager
Dmserver(邏輯磁盤(pán)管理員服務(wù))的進(jìn)程名是Svchost.exe,WinXP Home/Pro中默認(rèn)安裝的啟動(dòng)類型分別是手動(dòng)和自動(dòng),依賴Plug and Play、Remote Procedure Call服務(wù)。Dmserver用來(lái)動(dòng)態(tài)管理磁盤(pán),如顯示磁盤(pán)可用空間和使用Microsoft Management Console(MMC)主控臺(tái)中的磁盤(pán)管理功能。這個(gè)服務(wù)對(duì)于經(jīng)常使用移動(dòng)硬盤(pán)、U盤(pán)等外設(shè)的朋友來(lái)說(shuō)必不可少,沒(méi)有的話可選擇禁用它。
26.Logical Disk Manager Administrative Service
? Dmadmin(邏輯磁盤(pán)管理系統(tǒng)管理服務(wù))的進(jìn)程名是Svchost.exe,WinXP Home/Pro中默認(rèn)安裝的啟動(dòng)類型分別是手動(dòng)和自動(dòng),依賴Logical Disk Manager、Plug and Play、Remote Procedure Call服務(wù)。Dmadmin主要用來(lái)配置硬盤(pán)信息,平時(shí)基本上沒(méi)用。打開(kāi)"計(jì)算機(jī)管理"(Microsoft Management Console,簡(jiǎn)稱MMC)時(shí),你可以看到"磁盤(pán)管理",這時(shí)就會(huì)用上它,可設(shè)為手動(dòng)。
27.Messenger
Messenger (信使服務(wù))的進(jìn)程名是Services.exe,WinXP Home/Pro中默認(rèn)安裝的啟動(dòng)類型為自動(dòng),依賴NetBIOS Interface、Plug and Play、Remote Procedure Call、Workstation服務(wù)。Messenger這個(gè)服務(wù)上過(guò)網(wǎng)的人都應(yīng)該比較熟悉,本來(lái)Microsoft開(kāi)發(fā)"信使服務(wù)"是為了方便同一域 中的管理員進(jìn)行信息交流,后來(lái)有些人開(kāi)發(fā)了突破域限制的信使發(fā)送工具,于是大家掛在網(wǎng)上時(shí),計(jì)算機(jī)上經(jīng)常會(huì)彈出一個(gè)名為"信使服務(wù)"的對(duì)話框,這些不請(qǐng)自 到的"信使"基本上是一些垃圾信使信息,有無(wú)聊的廣告,有非法的信息等。通常這些信息是用一些名為"兇寶寶信使"、"妖刺"的軟件發(fā)布的,但實(shí)際上如果是 在同一域中,只需要用NET SEND命令就可以輕易發(fā)送消息了。突然出現(xiàn)的"信使服務(wù)"不僅會(huì)干擾工作,影響心情,而且還容易遭到"社會(huì)工程"攻擊,所以禁用它吧。
28.MS Software Shadow Copy Provider
SwPrv(管理磁盤(pán)區(qū)卷影復(fù)制服務(wù))的進(jìn)程名是dllhost.exe,WinXP Home/Pro中默認(rèn)安裝的啟動(dòng)類型是手動(dòng),依賴Remote Procedure Call服務(wù)。這個(gè)服務(wù)是為WinXP中的MS Backup備份程序提供支持,奇怪的是即使關(guān)掉它我的備份工作也可以順利完成,用不著的話就禁用它吧。
29.Net Logon
Netlogon(網(wǎng)域登錄服務(wù))的進(jìn)程名是lsass.exe,WinXP Home/Pro中默認(rèn)安裝的啟動(dòng)類型分別是手動(dòng)和自動(dòng),依賴Workstation服務(wù)。這個(gè)服務(wù)是用來(lái)做網(wǎng)域?qū)彶榈摹.?dāng)你的計(jì)算機(jī)處在一個(gè)域網(wǎng)內(nèi)時(shí), 如果要使用網(wǎng)內(nèi)的域服務(wù)器登錄到域網(wǎng)時(shí),就要通過(guò)它來(lái)登錄了。一般用戶用不著,禁用即可。
30.NetMeeting Remote Desktop Sharing
Mnmsrvc (NetMeeting遠(yuǎn)程桌面共享服務(wù))的進(jìn)程名是Mnmsrvc.exe,WinXP Home/Pro中默認(rèn)安裝的啟動(dòng)類型是手動(dòng),依賴Remote Procedure Call服務(wù)。使用NetMeeting可透過(guò)公司內(nèi)部網(wǎng)絡(luò),讓使用者將計(jì)算機(jī)的控制權(quán)分享給局域網(wǎng)上或因特網(wǎng)上的其他使用者,很多人都因?yàn)榘踩珕?wèn)題關(guān)掉 它,而且它很占網(wǎng)絡(luò)資源。但如果你想和別人做些非文字的交流,還是比較好玩的。注意關(guān)掉它后,遠(yuǎn)程桌面共享功能將無(wú)法使用。
31.Network Connections
Netman(網(wǎng)絡(luò)連接服務(wù))的進(jìn)程名是svchost.exe,WinXP Home/PRO默認(rèn)安裝的啟動(dòng)類型是手動(dòng),依賴于Remote Procedure Call服務(wù)。Netman也是非常重要的基礎(chǔ)服務(wù),它管理著"網(wǎng)絡(luò)和撥號(hào)連接"文件夾中的所有對(duì)象,任何有關(guān)于網(wǎng)絡(luò)上(局域網(wǎng)、Internet)的連 接都需要這個(gè)服務(wù)。如果被禁用,在"網(wǎng)絡(luò)和撥號(hào)連接"文件夾中將什么都看不到,更不用說(shuō)新建連接和撥號(hào)上網(wǎng)了。因此除非你的機(jī)器是絕對(duì)的單機(jī)環(huán)境,才可將 其關(guān)閉。
32.Network DDE
NetDDE(網(wǎng)絡(luò)動(dòng)態(tài)數(shù)據(jù)交換服務(wù))的進(jìn)程名是netdde.exe,WinXP Home/PRO默認(rèn)安裝的啟動(dòng)類型是手動(dòng),依賴于Network DDE DSDM服務(wù)。NetDDE(Network Dynamic Data Exchange)是微軟早期設(shè)計(jì)的一種方法,可讓?xiě)?yīng)用程序在不同PC上的Windows之間交換動(dòng)態(tài)數(shù)據(jù),現(xiàn)在已經(jīng)很少使用。實(shí)際上在WinXP中,真 正使用它的只有ClipBook服務(wù),回顧上一期中提到的3人共同開(kāi)發(fā)文檔,通過(guò)ClipBook來(lái)交換動(dòng)態(tài)數(shù)據(jù)的例子就可以很好理解這個(gè)服務(wù)的作用了。 數(shù)據(jù)共享服務(wù)通常是經(jīng)過(guò)可信賴的溝通渠道,負(fù)責(zé)管理這項(xiàng)服務(wù)的是網(wǎng)絡(luò)DDE代理(Network DDE Agent),實(shí)際上網(wǎng)絡(luò)DDE代理會(huì)使機(jī)器非常容易遭受攻擊而失去本機(jī)的管理員控制權(quán)。因此如果無(wú)需ClipBook共享這個(gè)特殊服務(wù),不妨禁用。
33.Network DDE DSDM
NetDDE dsdm(網(wǎng)絡(luò)動(dòng)態(tài)數(shù)據(jù)交換網(wǎng)絡(luò)共享服務(wù))的進(jìn)程名是netdde.exe,WinXP Home/PRO默認(rèn)安裝的啟動(dòng)類型是手動(dòng),它不依賴于其他服務(wù)。如果此服務(wù)終止,Network DDE服務(wù)將不可用,實(shí)際上如果不用Network DDE,那么Network DDE DSDM也禁用好了。
34.Network Location Awareness
NLA (網(wǎng)絡(luò)位置識(shí)別服務(wù))的進(jìn)程名是svchost.exe,WinXP Home/PRO默認(rèn)安裝的啟動(dòng)類型是手動(dòng),依賴于AFD網(wǎng)絡(luò)支持環(huán)境和TCP/IP Protocol Driver服務(wù),而ICF/ICS服務(wù)依賴于它。NLA可以探測(cè)網(wǎng)絡(luò)系統(tǒng)的相關(guān)信息,當(dāng)這些信息發(fā)生變化時(shí)通知相關(guān)的應(yīng)用程序。基本上,這個(gè)服務(wù)主要針 對(duì)的對(duì)象是筆記本電腦。因?yàn)樵趯?shí)際工作和生活中,人們的筆記本電腦常常在超過(guò)一個(gè)以上的網(wǎng)絡(luò)環(huán)境中應(yīng)用。經(jīng)常可能遇到在一個(gè)網(wǎng)絡(luò)中需要使用動(dòng)態(tài)IP地址, 而在另一網(wǎng)絡(luò)中需要使用靜態(tài)IP地址的問(wèn)題。比如說(shuō)你在辦公室里使用的是動(dòng)態(tài)IP,而在家里卻使用靜態(tài)IP來(lái)連接寬帶,那么NLA就可讓你在家里及單位網(wǎng) 絡(luò)(有線)之間切換時(shí)自動(dòng)辨認(rèn)出不同網(wǎng)絡(luò)環(huán)境,從而自動(dòng)選擇合適的配置而無(wú)需重新調(diào)整網(wǎng)絡(luò)參數(shù)。對(duì)于經(jīng)常移動(dòng)辦公的人,這確實(shí)是個(gè)不錯(cuò)的功能。
35.NT LM Security Support Provider
NtLmSsp (NT LM安全性支持提供者服務(wù))的進(jìn)程名是lsass.exe,WinXP Home/PRO默認(rèn)安裝的啟動(dòng)類型是手動(dòng),它不依賴于其他服務(wù)。NT LM的意思即NT LanManger,是NT下提供的認(rèn)證方法之一,使用了64位的加密手段。NtLmSsp這個(gè)服務(wù)主要針對(duì)RPC(遠(yuǎn)程過(guò)程調(diào)用),通常RPC可以選擇 基于兩種通信方式,一種是傳輸協(xié)議,比如TCP/IP、UDP、IPX等,另一種為命名管道(Pipeline)。通常情況下Windows默認(rèn)選擇都是 傳輸協(xié)議,而由于RPC是采用非加密傳輸?shù)模ㄐ艛?shù)據(jù)安全無(wú)法得到保證,而NtLmSsp就可向這一類RPC提供安全服務(wù)。WinXP中已知的這類RPC 應(yīng)用就是Telnet服務(wù)(Telnet也依賴于NtLmSsp),因此無(wú)需Telnet服務(wù)的單機(jī)用戶可將NtLmSsp其關(guān)閉。
36.Performance Logs and Alerts
SysmonLog (效能記錄日志及警示服務(wù))的進(jìn)程名是smlogsvc.exe,WinXP Home/PRO默認(rèn)安裝的啟動(dòng)類型是手動(dòng),它沒(méi)有任何服務(wù)依存關(guān)系。如果打開(kāi)控制面板的管理工具,可以看到有"性能"這個(gè)工具,它較詳細(xì)地反映了系統(tǒng)的 性能,但配置起來(lái)相當(dāng)復(fù)雜,不好上手,而且大多數(shù)人也會(huì)認(rèn)為這個(gè)性能工具沒(méi)什么意義。
SysmonLog就是為它提供日志記錄的服務(wù)。如果 你對(duì)自己機(jī)器的工作狀態(tài)比較在意,這絕對(duì)是一個(gè)值得研究的工具,因?yàn)樗梢試?yán)格監(jiān)視硬盤(pán)、內(nèi)存、CPU甚至于軟件在系統(tǒng)中的運(yùn)行,并通過(guò)記錄下的日志數(shù)據(jù) 分析機(jī)器軟硬件資源的具體情況。更有用的是,如果你比較了解計(jì)數(shù)器這個(gè)參數(shù)的設(shè)置,就可為各部分資源設(shè)置合適的計(jì)數(shù)器值,一旦服務(wù)監(jiān)視到資源的性能值超過(guò) 或是低于此值,就會(huì)通過(guò)Messenger服務(wù)發(fā)出警告,如此很容易就能覺(jué)察到機(jī)器的某部分資源不足(如若升級(jí)電腦就可先從這里考慮)或發(fā)生了故障等。當(dāng) 然,并不關(guān)心自己機(jī)器具體工作的用戶也可將其關(guān)閉。
37.Plug and Play
PlugPlay(即插即用服務(wù))的進(jìn)程名是services.exe,WinXP Home/PRO默認(rèn)安裝的啟動(dòng)類型是自動(dòng),它不依賴于任何服務(wù)。這個(gè)服務(wù)想必大家相當(dāng)熟悉,從Win98開(kāi)始這個(gè)技術(shù)就始終是微軟操作系統(tǒng)的核心部分。 即插即用是Intel開(kāi)發(fā)的一組規(guī)范,它賦予了計(jì)算機(jī)自動(dòng)檢測(cè)和配置設(shè)備并安裝相應(yīng)驅(qū)動(dòng)程序的能力,當(dāng)有設(shè)備被更改時(shí)能自動(dòng)通知當(dāng)前設(shè)備的狀況并使用該設(shè) 備變更后的程序。PlugPlay是WinXP的幾個(gè)基礎(chǔ)服務(wù)之一,在服務(wù)管理工具中無(wú)法調(diào)整它,而且如果本服務(wù)一旦失敗就只有重新啟動(dòng)機(jī)器了。
38.Portable Media Serial Number Service
WmdmPmSp(便攜的媒體序號(hào)服務(wù))的進(jìn)程名是svchost.exe,WinXP Home/PRO默認(rèn)安裝的啟動(dòng)類型是自動(dòng),它沒(méi)有任何服務(wù)依存關(guān)系。這個(gè)服務(wù)其實(shí)非常簡(jiǎn)單,它是微軟用來(lái)防盜版的工具之一,但目前基本上只是針對(duì)音樂(lè)。 微軟用它獲得你系統(tǒng)中媒體播放器的序列號(hào),做什么用呢?其實(shí)它是在試圖控制你將盜版的音樂(lè)文件拷貝到類似MP3、MD等便攜播放器上。盡管微軟聲稱關(guān)掉這 個(gè)服務(wù)會(huì)影響將正版音樂(lè)下載到便攜播放器,但筆者還是關(guān)掉這個(gè)服務(wù),一是影響并不大,至少手上的正版CD拷貝到MP3是沒(méi)有問(wèn)題的,二是微軟也刺探得太多 了吧,我們用什么還都得報(bào)告它?
39.Print Spooler
Spooler(打印后臺(tái)處理服務(wù))的進(jìn)程名是 spoolsv.exe,WinXP Home/PRO默認(rèn)安裝的啟動(dòng)類型是自動(dòng),依賴于Remote Procedure Call。Spooler是為了提高文件打印效率,將多個(gè)請(qǐng)求打印的文檔統(tǒng)一進(jìn)行保存和管理,先將要打印的文件拷貝到內(nèi)存,待打印機(jī)空閑后,再將數(shù)據(jù)送往 打印機(jī)處理。這樣處理速度更快些。建議將其設(shè)置為手動(dòng),有打印任務(wù)時(shí)再打開(kāi)。如果沒(méi)有打印機(jī)自然是禁用了。
40.Protected Storage
ProtectedStorage (受保護(hù)存放區(qū)服務(wù))的進(jìn)程名是lsass.exe,WinXP Home/PRO默認(rèn)安裝的啟動(dòng)類型是自動(dòng),依賴于Remote Procedure Call。這一服務(wù)提供對(duì)敏感性數(shù)據(jù)保護(hù)的功能,比如密碼、證書(shū)等,但通常它只針對(duì)Windows自身的敏感數(shù)據(jù)進(jìn)行保護(hù),可用來(lái)儲(chǔ)存你計(jì)算機(jī)上的密碼。 通常上網(wǎng)的用戶都比較喜歡開(kāi)這個(gè)服務(wù),畢竟像自動(dòng)填表這些功能給人帶來(lái)不少方便。但如果你的電腦是多用戶環(huán)境,或是使用筆記本電腦,經(jīng)常移動(dòng)辦公,那么這 個(gè)服務(wù)就要謹(jǐn)慎使用了。有不少密碼破解軟件就是針對(duì)這個(gè)ProtectedStorage的,比較有名的有Protected Storage PassView,用它可以輕易得到被儲(chǔ)存在ProtectedStorage中你曾經(jīng)上過(guò)的論壇的帳號(hào)密碼、撥號(hào)密碼等。因此,對(duì)于這個(gè)服務(wù)要視使用環(huán) 境而定,在不安全的環(huán)境下還是關(guān)閉較好。
41.QoS RSVP
RSVP(QoS 許可控制服務(wù))的進(jìn)程名是rsvp.exe,WinXP Home/PRO默認(rèn)安裝的啟動(dòng)類型是手動(dòng),依賴于AFD Networking Support Environment、Remote Procedure Call、TCP/IP Protocol Driver服務(wù)。這就是微軟那個(gè)飽受爭(zhēng)議的占用了20%網(wǎng)絡(luò)帶寬的服務(wù)了。對(duì)大多數(shù)朋友來(lái)說(shuō),關(guān)掉它是簡(jiǎn)單正確的選擇。但是要理解這個(gè)服務(wù)究竟是干什么 的就不這么簡(jiǎn)單了。QoS這個(gè)詞的意思是服務(wù)質(zhì)量(Quality of Service),而RSVP這個(gè)詞的意思是資源預(yù)留協(xié)議(ReSerVation Protocol)。
隨著IP技術(shù)和網(wǎng)絡(luò)的發(fā)展,世界 各國(guó)的運(yùn)營(yíng)商基于IP網(wǎng)絡(luò)已開(kāi)發(fā)出多種多樣的新業(yè)務(wù)。由于目前基于存儲(chǔ)轉(zhuǎn)發(fā)機(jī)制的Internet(IPv4標(biāo)準(zhǔn))只為用戶提供了"盡力而為(best- effort)"的服務(wù),不能保證數(shù)據(jù)包傳輸?shù)膶?shí)時(shí)性、完整性以及到達(dá)的順序性,更無(wú)法保障實(shí)時(shí)多媒體業(yè)務(wù)服務(wù)質(zhì)量(QoS),所以主要應(yīng)用在文件傳送和 電子郵件服務(wù)。而隨著Internet的飛速發(fā)展,人們對(duì)于在Internet上傳輸多媒體信息的需求越來(lái)越大,這就要求網(wǎng)絡(luò)應(yīng)能根據(jù)用戶的要求分配和調(diào) 度資源,傳統(tǒng)的"盡力而為"轉(zhuǎn)發(fā)機(jī)制已不能滿足用戶的要求。為解決這一問(wèn)題,美國(guó)于1996年底開(kāi)始了以提高網(wǎng)絡(luò)服務(wù)質(zhì)量研究為核心的InternetⅡ 以及NGI(下一代Internet)等研究項(xiàng)目。相關(guān)的權(quán)威組織IETF(Internet Engineering Task Force)也成立了專門(mén)的工作小組來(lái)研究多媒體服務(wù)質(zhì)量的定義和相關(guān)標(biāo)準(zhǔn)。IETF在IP網(wǎng)絡(luò)的QoS方面提出了多種服務(wù)模型和機(jī)制,其中的綜合業(yè)務(wù)模 型(Int-Serv)引入了一個(gè)重要的網(wǎng)絡(luò)控制協(xié)議RSVP(資源預(yù)留協(xié)議),這一模型的思想是"為了給特定的客戶包流提供特殊的QoS,要求路由器必 須能夠預(yù)留資源。反過(guò)來(lái)要求路由器中有特定流的狀態(tài)信息"。所以可以看出,這一模型能提供絕對(duì)有保證的QoS,是以預(yù)留下的資源作為代價(jià)的,對(duì)資源的要求 實(shí)際上是更高的。因此,對(duì)于WinXP中的QoS RSVP服務(wù)保留了20%的網(wǎng)絡(luò)帶寬也就不足為奇了,由于對(duì)于個(gè)人應(yīng)用幾乎毫無(wú)意義,禁用它是不二選擇。
42.Remote Access Auto Connection Manager
RasAuto (遠(yuǎn)程訪問(wèn)自動(dòng)聯(lián)機(jī)管理員服務(wù))的進(jìn)程名是svchost.exe,WinXP Home/PRO默認(rèn)安裝的啟動(dòng)類型是手動(dòng),依賴于Remote Access Connection Manager、Telephony服務(wù)。RasAuto主要針對(duì)寬帶使用,當(dāng)有網(wǎng)絡(luò)連接請(qǐng)求時(shí)它會(huì)自動(dòng)打開(kāi)網(wǎng)絡(luò)連接,我們?cè)谑褂肳inXP時(shí)會(huì)經(jīng)常彈出 一個(gè)自動(dòng)撥號(hào)窗口,就是它在工作。如果你的機(jī)器提供網(wǎng)絡(luò)共享服務(wù)就開(kāi)著它,避免網(wǎng)絡(luò)斷線后手動(dòng)連接,否則可將其關(guān)閉。?
43.Remote Access Connection Manager
RasMan(遠(yuǎn)程訪問(wèn)聯(lián)機(jī)管理員服務(wù))的進(jìn)程名是svchost.exe,WinXP Home/PRO默認(rèn)安裝的啟動(dòng)類型是手動(dòng),依賴于Telephony服務(wù),其簡(jiǎn)單描述是"創(chuàng)建網(wǎng)絡(luò)連接",這個(gè)解釋簡(jiǎn)單明了,所以根據(jù)自己系統(tǒng)的情況來(lái)使用這個(gè)服務(wù)即可。
44.Remote Desktop Help Session Manager
RDSessMgr (遠(yuǎn)程桌面協(xié)助服務(wù))的進(jìn)程名是sessmgr.exe,WinXP Home/PRO默認(rèn)安裝的啟動(dòng)類型是手動(dòng),依賴于Remote Procedure Call服務(wù)。這是與NetMeeting Remote Desktop Sharing很類似的一個(gè)服務(wù)。鼠標(biāo)點(diǎn)擊"開(kāi)始→所有程序→附件→通訊→遠(yuǎn)程桌面連接"可開(kāi)遠(yuǎn)程桌面功能,而RDSessMgr就是為它提供支持。微軟 的原意是通過(guò)它做遠(yuǎn)程幫助,其代價(jià)是犧牲安全與4MB內(nèi)存的占用,不需要時(shí)一定得關(guān)閉。
45.Remote Procedure Call
RpcSs (遠(yuǎn)程過(guò)程調(diào)用服務(wù))的進(jìn)程名是svchost.exe,WinXP Home/PRO默認(rèn)安裝的啟動(dòng)類型是自動(dòng)。太多服務(wù)依賴于這一服務(wù)了,最近"沖擊波"橫行,恐怕大家都對(duì)RPC有此印象了吧,它原名遠(yuǎn)程進(jìn)程調(diào)用,是早 期IBM、SUN等公司定義的功能級(jí)通信協(xié)議,隨后被微軟采納,但作了改動(dòng),稱之為MRPC。總的來(lái)說(shuō)RPC是一種消息傳遞功能,上一期說(shuō)過(guò) Windows系統(tǒng)是個(gè)典型的消息(事件)處理型系統(tǒng),所以RPC對(duì)于系統(tǒng)的重要性不言而喻。由于Windows內(nèi)部結(jié)構(gòu)已相當(dāng)復(fù)雜了,很難搞清楚哪些模 塊在用RPC哪些不用,事實(shí)上你只要關(guān)掉它,系統(tǒng)就可能崩潰。所以這個(gè)服務(wù)也是不可禁用的。
46.Remote Procedure Call(RPC)Locator
RpcLocator (遠(yuǎn)程過(guò)程調(diào)用定位服務(wù))的進(jìn)程名是locator.exe,WinXP Home/PRO默認(rèn)安裝的啟動(dòng)類型是手動(dòng),依賴于Workstation服務(wù)。這一服務(wù)和上面的RPC服務(wù)并無(wú)太多關(guān)系,是用來(lái)給RPC的命名服務(wù)的。 其用途簡(jiǎn)單解釋就是,通過(guò)它對(duì)RPC的命名管理,調(diào)用者才能找到被調(diào)用者的位置。但由于微軟系統(tǒng)注冊(cè)表的存在,使得這些命名服務(wù)在本機(jī)上的調(diào)用上毫無(wú)意 義。因此對(duì)于一般用戶完全可以關(guān)閉。
47.Remote Registry
RemoteRegistry(遠(yuǎn)程注冊(cè)表服務(wù))的進(jìn) 程名是svchost.exe,在WinXP Home下不可用,在WinXP PRO下默認(rèn)安裝的啟動(dòng)類型是自動(dòng),依賴于Remote Procedure Call服務(wù)。此服務(wù)是向其他連機(jī)的計(jì)算機(jī)開(kāi)放你的注冊(cè)表,微軟總是讓這種明顯是安全隱患的服務(wù)自動(dòng)啟動(dòng)實(shí)在讓人費(fèi)解。不過(guò)如果你有這種特殊需求的話可以 嘗試一下。打開(kāi)注冊(cè)表編輯器Regedit,在文件菜單欄里找到"連接網(wǎng)絡(luò)注冊(cè)表"這一項(xiàng),可讓你打開(kāi)甚至編輯其他機(jī)器上的注冊(cè)表。當(dāng)然那些機(jī)器上的 RemoteRegistry也必須是打開(kāi)的,而且對(duì)你計(jì)算機(jī)的一些相應(yīng)權(quán)限同樣必須開(kāi)放。
48.Removable Storage
NtmsSvc (卸除式存放裝置服務(wù))的進(jìn)程名是svchost.exe,在WinXP Home/PRO下默認(rèn)安裝的啟動(dòng)類型是手動(dòng),依賴于Remote Procedure Call服務(wù)。此服務(wù)的名稱太容易讓人誤解,實(shí)際上它只是對(duì)特殊可移動(dòng)存儲(chǔ)器的管理,比如ZIP軟驅(qū)和磁帶驅(qū)動(dòng)器,不要擔(dān)心你的CD和DVD等設(shè)備。從事 圖像設(shè)計(jì)的用戶經(jīng)常會(huì)用ZIP同蘋(píng)果機(jī)交換文件,一般人恐怕很少使用這些特殊設(shè)備,因此可將其關(guān)閉。
49.Routing and Remote Access
RemoteAccess (路由和遠(yuǎn)程訪問(wèn)服務(wù))的進(jìn)程名是svchost.exe,在WinXP Home/PRO下默認(rèn)安裝的啟動(dòng)類型分別為禁用和手動(dòng),依賴于NetBIOSGroup、Remote Procedure Call服務(wù)。Routing and Remote Access為軟路由,即在一臺(tái)連接多個(gè)網(wǎng)絡(luò)的計(jì)算機(jī)上通過(guò)運(yùn)行路由軟件,以實(shí)現(xiàn)網(wǎng)絡(luò)間路由的一種方法,相對(duì)于硬件路由來(lái)說(shuō)很是方便經(jīng)濟(jì)。WinXP也把 這個(gè)功能集成到系統(tǒng)里來(lái)了,不過(guò)可能比較少人知道是在哪里配置路由,主要原因就是這個(gè)服務(wù)默認(rèn)為關(guān)閉。首先啟動(dòng)此服務(wù),網(wǎng)絡(luò)連接文件夾里會(huì)多出一個(gè)"傳入 的連接",值得注意的是,在VPN連接(傳入的連接)的屬性"Internet協(xié)議(TCP/IP)"里一般要指定TCP/IP地址(一般來(lái)說(shuō)都必須是合 法地址)才行。感興趣的朋友可以自己繼續(xù)研究,而大多數(shù)不需要的朋友直接禁用它吧。
50.Secondary Logon
Seclogon (二次登錄服務(wù))的進(jìn)程名是svchost.exe,在WinXP Home/PRO下默認(rèn)安裝的啟動(dòng)類型是自動(dòng),沒(méi)有任何服務(wù)依存關(guān)系。這個(gè)服務(wù)對(duì)應(yīng)于用戶臨時(shí)權(quán)限分配功能,在多用戶使用的計(jì)算機(jī)上,某些用戶因?yàn)槭欠枪?理員權(quán)限,導(dǎo)致某些程序無(wú)法執(zhí)行。為了讓沒(méi)有管理員權(quán)限的已經(jīng)登錄用戶可以使用這些程序,WinXP設(shè)計(jì)了這個(gè)功能來(lái)分配臨時(shí)的管理員權(quán)限。打開(kāi)這個(gè)服務(wù) 后,右鍵點(diǎn)擊鼠標(biāo)選擇"運(yùn)行方式"將會(huì)出現(xiàn)對(duì)話框,讓你選擇執(zhí)行這個(gè)程序的用戶身份。對(duì)多用戶環(huán)境下的管理員,這確實(shí)是方便的功能,不過(guò)依然是以安全作為 代價(jià)的,對(duì)單人環(huán)境的筆記本電腦用戶來(lái)說(shuō)尤其無(wú)用而且危險(xiǎn)!所以要謹(jǐn)慎使用。
51.Security Accounts Manager
SamSs(安全賬戶管理 服務(wù))的進(jìn)程名是lsass.exe,在WinXP Home/PRO下默認(rèn)安裝的啟動(dòng)類型是自動(dòng),依賴于Remote Procedure Call服務(wù)。熟悉WinXP啟動(dòng)過(guò)程的用戶都知道SAM文件的重要性,SamSs是負(fù)責(zé)SAM數(shù)據(jù)庫(kù)的控制和維護(hù)的服務(wù)。SAM數(shù)據(jù)庫(kù)位于注冊(cè)表 "HKLM\SAM\SAM"下,可使用Regedit32.exe打開(kāi)注冊(cè)表編輯器,并設(shè)置適當(dāng)權(quán)限查看SAM中的內(nèi)容。SAM數(shù)據(jù)庫(kù)保存在磁盤(pán)上的" 系統(tǒng)盤(pán)\windows\system32\config"目錄下的sam文件中,在這個(gè)目錄下還包括一個(gè)security文件,是安全數(shù)據(jù)庫(kù)的內(nèi)容,兩 者有不少關(guān)系。SAM數(shù)據(jù)庫(kù)中包含了系統(tǒng)中所有組、賬戶的信息。而WinXP啟動(dòng)時(shí)就需要在SAM文件中讀取諸如用戶名、用戶全名(full name)、所屬組、描述、密碼、注釋、是否可以更改密碼、密碼設(shè)置時(shí)間等信息。這也是系統(tǒng)中不可關(guān)閉的幾個(gè)基礎(chǔ)服務(wù)之一,如果服務(wù)啟動(dòng)失敗,系統(tǒng)就只有 重啟了。
52.Server
Lanmanserver(服務(wù)器服務(wù))的進(jìn)程名是svchost.exe,在WinXP Home/PRO下默認(rèn)安裝的啟動(dòng)類型是自動(dòng)。Server服務(wù)對(duì)應(yīng)的是網(wǎng)絡(luò)上的文件/打印機(jī)器共享,以及網(wǎng)絡(luò)的路徑映射共享功能。沒(méi)有這些方面的需要你就可以關(guān)閉它。
53.Shell Hardware Detection
ShellHWDetection (外殼硬件探測(cè)服務(wù))的進(jìn)程名是svchost.exe,在WinXP Home/PRO下默認(rèn)安裝的啟動(dòng)類型是自動(dòng),依賴于Remote Procedure Call服務(wù)。對(duì)這個(gè)服務(wù)微軟是語(yǔ)焉不詳,也沒(méi)有給出詳細(xì)的硬件描述或列表,不過(guò)根據(jù)網(wǎng)絡(luò)上不少人的測(cè)試,這個(gè)服務(wù)主要還是和具有自動(dòng)運(yùn)行(播放)功能的 硬件有關(guān)系,例如數(shù)字相機(jī)、CD-ROM等。通過(guò)這個(gè)服務(wù),當(dāng)這些硬件接上系統(tǒng)或放入相應(yīng)媒介時(shí),WinXP能自動(dòng)探測(cè)到并做出對(duì)應(yīng)動(dòng)作。對(duì)于外設(shè)越來(lái)越 多的現(xiàn)在,沒(méi)有把握還是不要輕易關(guān)閉它。
54.Smart Card
SCardSvr(智能卡服務(wù))的進(jìn)程名是 SCardSvr.exe,在WinXP Home/PRO下默認(rèn)安裝的啟動(dòng)類型是手動(dòng),依賴于Plug and Play服務(wù)。Smart Card(智能卡)其外型和一般信用卡大小一樣,但多了一塊指甲大小的IC芯片后,使原本普通的一張卡片變成擁有資料控管與邏輯運(yùn)算的能力。智能卡包括金 融卡、GSM卡等,與我們一般常用的電話IC卡相比,內(nèi)部的IC線路設(shè)計(jì)不同。由于卡內(nèi)本身即已包含了CPU功能、ROM、EEPROM、RAM等元件, 智能卡就像一臺(tái)可隨身攜帶的超微型電腦,可用來(lái)儲(chǔ)存及處理重要資料。在安全性方面,智能卡具有自我毀滅系統(tǒng),想竊取卡上的資料非常困難。如果你擁有智能卡 及相關(guān)的讀卡設(shè)備就開(kāi)啟這個(gè)服務(wù),否則就禁用吧。
55.Smart Card Helper
SCardDrv(智能卡協(xié)助服務(wù))的進(jìn)程名是SCardSvr.exe,在WinXP Home/PRO下默認(rèn)安裝的啟動(dòng)類型是手動(dòng),它沒(méi)有任何服務(wù)依存關(guān)系。只要沒(méi)有相關(guān)的設(shè)備就禁用好了。
56.SSDP Discovery Service
? SSDPSRV(簡(jiǎn)易服務(wù)發(fā)現(xiàn)協(xié)議之發(fā)現(xiàn)服務(wù))的進(jìn)程名是svchost.exe,在WinXP Home/PRO下默認(rèn)安裝的啟動(dòng)類型是手動(dòng)。SSDPSRV主要用于局域網(wǎng)上UPnP(Universal Plug and Play,統(tǒng)一即插即用)設(shè)備的搜索。UPnP并不同于我們平常熟悉的PnP,UPnP技術(shù)PnP對(duì)進(jìn)行了擴(kuò)展,簡(jiǎn)化了家庭或企業(yè)中智能設(shè)備的聯(lián)網(wǎng)過(guò)程。 UPnP規(guī)范基于TCP/IP協(xié)議和針對(duì)設(shè)備彼此間通信而制訂的其他Internet協(xié)議,這就是它之所以被稱作"通用"的原因所在-——UPnP技術(shù)不 依賴于特定的設(shè)備驅(qū)動(dòng)程序,而是使用標(biāo)準(zhǔn)協(xié)議。與即插即用相比,這種技術(shù)的意義在于,能夠輕易地使家庭等非專業(yè)用戶享受到智能化技術(shù)帶來(lái)的更舒適完美的生 活,例如,正是UPnP才使得能在網(wǎng)上沖浪的電冰箱成為可能。UPnP是個(gè)較新的協(xié)議,也不是非常成熟,對(duì)應(yīng)設(shè)備在市場(chǎng)上非常罕見(jiàn),市場(chǎng)上流行的 Linksys BEFSR41W無(wú)線路由器是這方面的例子。對(duì)于大多數(shù)現(xiàn)在還無(wú)緣使用此類設(shè)備的朋友,關(guān)閉這個(gè)服務(wù)吧。
57.System Event Notification
SENS(系統(tǒng)事件通知服務(wù))的進(jìn)程名是svchost.exe,在WinXP Home/PRO下默認(rèn)安裝的啟動(dòng)類型是自動(dòng),依賴于COM+ Event System服務(wù)。它的簡(jiǎn)單描述是"跟蹤系統(tǒng)事件,如登錄Windows、網(wǎng)絡(luò)以及電源事件等。將這些事件通知給COM+事件系統(tǒng)‘訂閱者 (subscriber)’"。這已將服務(wù)的內(nèi)容解釋得很清楚了。盡管有人認(rèn)為這個(gè)服務(wù)無(wú)關(guān)緊要,事實(shí)上系統(tǒng)是否需要它取決于你在系統(tǒng)里安裝了些什么,而 許多應(yīng)用程序的運(yùn)行是要通過(guò)SENS來(lái)實(shí)現(xiàn)的,所以建議還是讓它自動(dòng)打開(kāi)為好。
58.System Restore Service
Srservice (系統(tǒng)還原服務(wù))的進(jìn)程名是svchost.exe,在WinXP Home/PRO下默認(rèn)安裝的啟動(dòng)類型是自動(dòng),依賴于Remote Procedure Call服務(wù)。這是大家都非常熟悉的系統(tǒng)還原功能了,如果不使用的話,先在"我的電腦"屬性中的系統(tǒng)還原選項(xiàng)卡關(guān)閉,然后在這里將服務(wù)禁用即可。
59.Task Scheduler
Schedule (計(jì)劃任務(wù)服務(wù))的進(jìn)程名是svchost.exe,在WinXP Home/PRO下默認(rèn)安裝的啟動(dòng)類型是自動(dòng),依賴于Remote Procedure Call服務(wù)。此服務(wù)支持WinXP的計(jì)劃任務(wù),它能使程序在預(yù)定的時(shí)間自動(dòng)運(yùn)行,如定期進(jìn)行磁盤(pán)碎片整理、病毒掃描、更新等,可根據(jù)自己的需要選擇是否 開(kāi)啟。
60.TCP/IP NetBIOS Helper
LmHosts(TCP/IP NetBIOS 助手服務(wù))的進(jìn)程名是svchost.exe,在WinXP Home/PRO下默認(rèn)安裝的啟動(dòng)類型是自動(dòng),依賴于AFD網(wǎng)絡(luò)支持環(huán)境、NetBios Over TCP/IP服務(wù)。該服務(wù)能在TCP/IP上提供NetBIOS支持。大家應(yīng)該對(duì)TCP/IP比較熟悉了,相對(duì)來(lái)說(shuō)NetBIOS網(wǎng)絡(luò)協(xié)議對(duì)讀者來(lái)說(shuō)可能 比較陌生,它是由IBM開(kāi)發(fā)的一個(gè)很古老的協(xié)議,當(dāng)年在局域網(wǎng)上占據(jù)主導(dǎo)。由于NetBIOS不具備路由功能,也就是說(shuō)它的數(shù)據(jù)包無(wú)法跨網(wǎng)段傳輸,因此在 廣域網(wǎng)、城域網(wǎng)大行其道的今天,它只能退居配角。其實(shí)在Win95/98的網(wǎng)絡(luò)協(xié)議中仍然保留著NetBIOS,不過(guò)它已經(jīng)改名叫NetBEUI (NetBIOS擴(kuò)展用戶接口),是NetBIOS的Microsoft改進(jìn)版。由于NetBIOS是完全基于局域網(wǎng)的,因此作為訪問(wèn)Internet資 源的一般用戶可以禁用它,除非你的系統(tǒng)處在小局域網(wǎng)中,而且使用的也正是NetBIOS協(xié)議。
61.Telephony
TapiSrv(電話服務(wù))的進(jìn)程名是 svchost.exe,在WinXP Home/PRO下默認(rèn)安裝的啟動(dòng)類型是手動(dòng),依賴于Plug and Play、Remote Procedure Call服務(wù)。簡(jiǎn)單地說(shuō)這個(gè)服務(wù)能為計(jì)算機(jī)提供電話撥號(hào)的能力。如果你使用了任何形式的撥號(hào),不管是用撥號(hào)調(diào)制解調(diào)器還是DSL/Cable連接到 Internet,還是通過(guò)電話線連接其他計(jì)算機(jī),或是撥打電腦IP電話、發(fā)傳真等,你就有必要保留這個(gè)服務(wù),反之就可關(guān)掉它。
62.Telnet
TapiSrv(遠(yuǎn)程登錄服務(wù))的進(jìn)程名是tlntsvr.exe,在WinXP Home下不可用,在WinXP PRO下默認(rèn)安裝的啟動(dòng)類型是手動(dòng),依賴于NT LM Security Support Provider、Remote Procedure Call、TCP/IP Protocol Driver服務(wù)。這是一個(gè)容易遭到誤會(huì)的服務(wù)名稱,一般人會(huì)誤以為這是以前DOS下那個(gè)Telnet,關(guān)了之后就無(wú)法使用BBS。其實(shí)它與BBS無(wú)關(guān), 完全是微軟自己的Telnet系統(tǒng),盡管兩者的原理相差不大,即讓用戶以模擬終端的方式,登錄到Internet的某臺(tái)主機(jī)上,一旦連接成功,這些個(gè)人計(jì) 算機(jī)就好像是遠(yuǎn)程計(jì)算機(jī)的一個(gè)終端,可以像使用自己的計(jì)算機(jī)一樣輸入命令,運(yùn)行遠(yuǎn)程計(jì)算機(jī)中的程序。基于安全性理由,如果沒(méi)有特別需求,這個(gè)服務(wù)一定要關(guān) 掉禁用。
63.Terminal Services
TermService(終端機(jī)服務(wù))的進(jìn)程名是svchost.exe,在 WinXP Home/PRO下默認(rèn)安裝的啟動(dòng)類型是手動(dòng),依賴于Remote Procedure Call服務(wù)。它的簡(jiǎn)單描述是"允許多位用戶連接并控制一臺(tái)機(jī)器,并且在遠(yuǎn)程計(jì)算機(jī)上顯示桌面和應(yīng)用程序。這是遠(yuǎn)程桌面(包括管理員的遠(yuǎn)程桌面)、快速用 戶轉(zhuǎn)換、遠(yuǎn)程協(xié)助和終端服務(wù)器的基礎(chǔ)結(jié)構(gòu)"。這段描述已將該服務(wù)的用途解釋得很清楚了,需要強(qiáng)調(diào)的是,這些方便都是以安全為代價(jià)的,如果平時(shí)不用就一定要 關(guān)掉。
64.Themes
Themes(主題服務(wù))的進(jìn)程名是svchost.exe,在WinXP Home/PRO下默認(rèn)安裝的啟動(dòng)類型是自動(dòng),沒(méi)有服務(wù)依存關(guān)系。很多人都喜歡使用XP的布景主題,不過(guò)如果用戶沒(méi)有使用就關(guān)閉好了。
65.Uninterruptible Power Supply
UPS (UPS電源管理服務(wù))的進(jìn)程名是UPS.exe,在WinXP Home/PRO下默認(rèn)安裝的啟動(dòng)類型是手動(dòng),沒(méi)有服務(wù)依存關(guān)系。它的簡(jiǎn)單描述是"管理連接到計(jì)算機(jī)的不間斷電源(UPS)",同樣很好理解,UPS(不 間斷電源供應(yīng))一般用戶極少用到,除非你的電源供應(yīng)器具備此功能,不然可關(guān)閉。
66.Universal Plug and Play Device Host
UPNPhost (統(tǒng)一即插即用驅(qū)動(dòng)主機(jī)服務(wù))的進(jìn)程名是svchost.exe,在WinXP Home/PRO下默認(rèn)安裝的啟動(dòng)類型是手動(dòng),依賴于SSDP Discovery Service服務(wù)。它同SSDP Discovery Service是繼承關(guān)系,后者搜索發(fā)現(xiàn)UPnP設(shè)備,而UPNPhost為UPnP設(shè)備提供驅(qū)動(dòng)支持。當(dāng)然通常情況下關(guān)閉即可。
67.Upload Manager
Uploadmgr (上傳管理服務(wù))的進(jìn)程名是svchost.exe,在WinXP Home/PRO下默認(rèn)安裝的啟動(dòng)類型是自動(dòng),依賴于Remote Procedure Call服務(wù)。這個(gè)服務(wù)的具體效果不明,關(guān)閉它后實(shí)際使用中的網(wǎng)絡(luò)上傳下載并沒(méi)有受到什么影響,也許它跟微軟的服務(wù)器和相關(guān)服務(wù)有關(guān)?請(qǐng)根據(jù)需要關(guān)閉。
68.Volume Shadow Copy
VSS(上傳管理服務(wù))的進(jìn)程名是vssvc.exe,在WinXP Home/PRO下默認(rèn)安裝的啟動(dòng)類型是手動(dòng),依賴于Remote Procedure Call服務(wù)。它的簡(jiǎn)單描述是"管理并執(zhí)行用于備份和其他目的的卷影復(fù)制",依然是和WinXP備份有關(guān)的服務(wù),它默認(rèn)就是關(guān)閉的,也并沒(méi)有在筆者的機(jī)器 上對(duì)備份造成影響,其具體應(yīng)用依是未解之謎。
69.WebClient
WebClient(Web客戶端服務(wù))的進(jìn)程名是 svchost.exe,在WinXP Home/PRO下默認(rèn)安裝的啟動(dòng)類型是自動(dòng),依賴于WebDav Client Redirector系統(tǒng)組件。使用WebDav可將檔案或數(shù)據(jù)夾上傳到某個(gè)Web服務(wù),這個(gè)服務(wù)對(duì)于未來(lái).NET意義更大。基于安全性的理由,現(xiàn)在你可 以嘗試關(guān)閉它。
70.Windows Audio
AudioSrv(Windows音頻服務(wù))的進(jìn)程名是 svchost.exe,在WinXP Home/PRO下默認(rèn)安裝的啟動(dòng)類型是自動(dòng),依賴于Plug and Play、Remote Procedure Call服務(wù)。理解這個(gè)服務(wù)再簡(jiǎn)單不過(guò)了,如果你的機(jī)器沒(méi)有聲卡可以關(guān)閉它
71.Windows Image Acquisition(WIA)
Stisvc (Windows影像取得服務(wù))的進(jìn)程名是svchost.exe,在WinXP Home/PRO下默認(rèn)安裝的啟動(dòng)類型是手動(dòng),依賴于Remote Procedure Call服務(wù)。該服務(wù)為控制面板中的"掃描儀和照相機(jī)"功能提供支持。通過(guò)這個(gè)功能,用戶在安裝好設(shè)備驅(qū)動(dòng)后無(wú)需要再安裝相關(guān)管理軟件,就能輕易操作掃描 儀和數(shù)碼相機(jī)來(lái)獲得圖像。不需要的用戶可關(guān)閉它。
72.Windows Installer
MSIServer(Windows 安裝服務(wù))的進(jìn)程名是msiexec\.exe,在WinXP Home/PRO下默認(rèn)安裝的啟動(dòng)類型是手動(dòng),依賴于Remote Procedure Call服務(wù)。這一服務(wù)同Application Management服務(wù)基本是一樣的。從微軟的解釋看,Windows Installer服務(wù)應(yīng)該是.MSI文件的最直接執(zhí)行者。同樣讓人奇怪的是,這個(gè)服務(wù)默認(rèn)就是關(guān)閉的,可.MSI文件的安裝、修復(fù)或刪除卻很正常,和備 份工具一樣,究竟這個(gè)服務(wù)在系統(tǒng)中扮演什么角色,如何工作,只有微軟的工程師才知道了。
73.Windows Time
W32Time(Windows時(shí)間服務(wù))的進(jìn)程名是svchost.exe,在WinXP Home/PRO下默認(rèn)安裝的啟動(dòng)類型是自動(dòng),它沒(méi)有服務(wù)依存關(guān)系。這一服務(wù)對(duì)應(yīng)WinXP的Internet對(duì)時(shí)服務(wù),如不需要關(guān)閉即可。
74.Windows Management Instrumentation(WMI)
Winmgmt (Windows管理規(guī)范服務(wù))的進(jìn)程名是svchost.exe,在WinXP Home/PRO下默認(rèn)安裝的啟動(dòng)類型是自動(dòng),依賴于Event Log、Remote Procedure Call服務(wù)。WMI是Windows中的基礎(chǔ)管理結(jié)構(gòu),它通過(guò)一組常用接口來(lái)控制和監(jiān)視系統(tǒng)(如對(duì)系統(tǒng)屬性的查看與更改、設(shè)置用戶權(quán)限等)。WMI為訪 問(wèn)大量的Windows管理數(shù)據(jù)提供了一個(gè)統(tǒng)一的機(jī)制。WMI通過(guò)腳本、C++程序接口、.NET類(系統(tǒng)管理)和命令行工具(WMIC)提供了對(duì)信息的 訪問(wèn)。WMI的功能還包括事件、遠(yuǎn)程、查詢、查看、計(jì)劃和實(shí)施用戶擴(kuò)展及更多內(nèi)容。總而言之,雖然在服務(wù)管理工具中可以關(guān)閉,但最好別動(dòng)它,否則會(huì)出現(xiàn)許 多莫名的問(wèn)題。
75.Windows Management Instrumentation Driver Extensions
Wmi (Windows管理規(guī)范驅(qū)動(dòng)延伸服務(wù))的進(jìn)程名是svchost.exe,在WinXP Home下不可用,在WinXP PRO下默認(rèn)安裝的啟動(dòng)類型是手動(dòng),沒(méi)有服務(wù)依存關(guān)系。微軟的白皮書(shū)介紹,該服務(wù)是作為WMI服務(wù)在驅(qū)動(dòng)程序方面的一個(gè)延伸,簡(jiǎn)單說(shuō)主要就是為讓系統(tǒng)方便 地獲知計(jì)算機(jī)中OEMs(original equipment manufacturers)以及IHVs(independent hardware vendors)等與硬件廠商相關(guān)的硬件信息。不過(guò)讓人奇怪的是,為什么它在WinXP Home下不可用呢?
76.Wireless Zero Configuration
WZCSVC (無(wú)線配置服務(wù))的進(jìn)程名是svchost.exe,在WinXP Home/PRO下默認(rèn)安裝的啟動(dòng)類型是自動(dòng),依賴于NDIS Usermode I/O Protocol組件、Remote Procedure Call服務(wù)。它的簡(jiǎn)單描述是"為您的802.11適配器提供自動(dòng)配置"。802.11是大家都比較熟悉的無(wú)線局域網(wǎng)協(xié)議標(biāo)準(zhǔn)了,其已經(jīng)在市場(chǎng)上占據(jù)了優(yōu) 勢(shì)。當(dāng)然,802.11協(xié)議、藍(lán)牙標(biāo)準(zhǔn)和HomeRF工業(yè)標(biāo)準(zhǔn)是無(wú)線局域網(wǎng)所有標(biāo)準(zhǔn)中最主要的競(jìng)爭(zhēng)對(duì)手,它們也各有優(yōu)劣。然而802.11b無(wú)線局域網(wǎng)技 術(shù)已經(jīng)在美國(guó)得到了廣泛的應(yīng)用,所以微軟的WinXP內(nèi)置服務(wù)支持也就不足為奇了。如果你沒(méi)有使用無(wú)線網(wǎng)絡(luò)適配卡裝置,那么可以關(guān)閉服務(wù)。
77.WMI Performance Adapter
WmiApSrv (WMI性能適配器服務(wù))的進(jìn)程名是wmiapsrv.exe,在WinXP Home/PRO下默認(rèn)安裝的啟動(dòng)類型是手動(dòng),依賴于Remote Procedure Call服務(wù)。此服務(wù)提供了從WMI HiPerf 提供者獲得的性能庫(kù)信息,需要以手動(dòng)方式進(jìn)行配置,并不會(huì)在缺省狀態(tài)下實(shí)現(xiàn)運(yùn)行。該服務(wù)太過(guò)專業(yè),無(wú)法解釋得淺顯,對(duì)于普通的使用者最好保持其默認(rèn)狀態(tài)。
78.Workstation
Lanmanworkstation(工作站服務(wù))的進(jìn)程名是svchost.exe,在WinXP Home/PRO下默認(rèn)安裝的啟動(dòng)類型是自動(dòng),它不依賴于其他服務(wù),但有不少服務(wù)都依賴它。該服務(wù)同樣為基礎(chǔ)服務(wù),請(qǐng)保持其默認(rèn)狀態(tài)不要關(guān)閉.
posted @
2006-05-21 03:01 Jerry Cat 閱讀(1067) |
評(píng)論 (1) |
編輯 收藏
Windows憑據(jù)管理
原文:http://m.shnenglu.com/Squirrel/archive/2006/05/20/7445.html
??????
題目中的Windows憑據(jù)(Credential)其實(shí)就是指用戶帳戶和口令。最近項(xiàng)目中存在一臺(tái)Windows(PC)機(jī)去管理服務(wù)器(Server),這之中就設(shè)計(jì)到服務(wù)器管理員權(quán)限的問(wèn)題。需要用戶對(duì)Windows上存儲(chǔ)的用戶名和密碼進(jìn)行管理。
?????? 在Windows XP和Server 2003 中都已存在了“存儲(chǔ)的用戶名和密碼”。在XP中,通過(guò)控制面板中的用戶帳戶-〉選擇用戶-〉管理我的網(wǎng)絡(luò)密碼。而在Server 2003中,則在控制面板下直接有“存儲(chǔ)的用戶名和密碼”項(xiàng)。
?????? 我們調(diào)用一些API,如WTSOpenServer,QueryServiceStatus,NetUserEnum等等涉及到RPC的,只要當(dāng)前用戶存儲(chǔ)有目標(biāo)遠(yuǎn)程機(jī)的權(quán)限合適的憑據(jù),則這些API就不會(huì)因產(chǎn)生ERROR_ACCESS_DENIED而執(zhí)行失敗。因?yàn)槲疫€不Windows的底層是如何進(jìn)行控制的,比如,是否調(diào)用了SSPI,所以,執(zhí)行這些API時(shí),我只能向用戶要管理員口令。但又不可能每次都讓用戶去輸入一遍用戶名和密碼,那么,也就需要保存密碼。
????? ?既然保存了密碼,就必須考慮刪除密碼,那么密碼管理的問(wèn)題也就來(lái)了。說(shuō)到密碼管理,我在前些年看電視的時(shí)候,看到介紹一個(gè)叫什么“網(wǎng)絡(luò)螃蟹”的網(wǎng)站,他就是專門(mén)提供個(gè)人密碼管理的,當(dāng)時(shí)我就想,有人會(huì)去把自己的密碼交給別人打理嗎?這好像不大可能。后來(lái)也就沒(méi)聽(tīng)到什么網(wǎng)絡(luò)螃蟹橫行的消息。
?????? 現(xiàn)在我的項(xiàng)目中,如果用戶有了一臺(tái)機(jī)器(PC)的密碼,那么,他就有了N臺(tái)服務(wù)器的管理員權(quán)限。這當(dāng)然是不被允許的了。怎么辦?
?????? 找了一些API,是Authentication Functions系列的。于是,下面一個(gè)小實(shí)驗(yàn)代碼就是想來(lái)枚舉用戶憑據(jù)的。
#include?<windows.h>
#include?<WinCred.h>

int?main()
{

??DWORD?dwCount?=?0;
??PCREDENTIAL?*?pCredArray?=?NULL?;


??if(?CredEnumerate(?NULL,?0,?&dwCount,?&pCredArray?)?)
{


????for(?DWORD?dwIndex?=?0;?dwIndex?<?dwCount;?dwIndex++)
{
??????PCREDENTIAL?pCredential?=?pCredArray[dwIndex];

??????cout?<<?"*********************************\r\n";

??????cout<<??"Flags:?"?<<?pCredential->Flags?<<?"\n"
??????????<<??"Type:??"?<<??pCredential->Type?<<?"\n"
??????????<<??"Name:??"?<<?pCredential->TargetName?<<?"\n"
??????????<<??"Persist:?"<<?pCredential->Persist??<<??"\n"
??????????<<??"User:??"?<<??pCredential->UserName?<<??"\n";

??????cout?<<?"Data:??\r\n";

??????char?szHexBuffer[256]?=?"";
??????char?szAsciiBuffer[256]?=?"";
??????char?szHex[16];
??????char?szAscii[2];
??????DWORD?dwByte;

??????for?(dwByte?=?0;?dwByte?<?pCredential->CredentialBlobSize;?dwByte++)

??????
{
????????BYTE?byte1?=?pCredential->CredentialBlob[dwByte];
????????sprintf(szHex,?"%2.2X?",?byte1);
????????szAscii[1]?=?'\0';

????????if?(byte1?>=?32?&&?byte1?<?128)
??????????szAscii[0]?=?(UCHAR)byte1;
????????else
??????????szAscii[0]?=?'?';

????????strcat(szHexBuffer,?szHex);
????????strcat(szAsciiBuffer,?szAscii);

????????if?(dwByte?==?pCredential->CredentialBlobSize?-?1?
??????????||?dwByte?%?16?==?15)

????????
{
??????????printf("%-50s?%s\r\n",?szHexBuffer,?szAsciiBuffer);
??????????szHexBuffer[0]?=?'\0';
??????????szAsciiBuffer[0]?=?'\0';
????????}

??????}

??????cout?<<?"*********************************\r\n";

????}

????CredFree(?pCredArray?);
??}
??//system(?"rundll32?keymgr.dll,KRShowKeyMgr");
??return?0;
}?????
好像憑據(jù)數(shù)據(jù)還沒(méi)能打出來(lái)。
?????? 后來(lái),本著“編程的最高境界就是不編程”的精神,我想,如果直接把Windows的那個(gè)“存儲(chǔ)的用戶名和密碼”對(duì)話框調(diào)出來(lái)用用不也可以嗎。用ProcessExplorer,找到一個(gè)叫keymgr.dll的東西,嗯,估計(jì)對(duì)話框就在里面。
?????? 在“運(yùn)行”中輸入“control keymgr.dll”或“rundll32 keymgr.dll,KRShowKeyMgr”,對(duì)話框就出來(lái)了。
?????? 又省事了!
posted @
2006-05-21 02:43 Jerry Cat 閱讀(756) |
評(píng)論 (0) |
編輯 收藏
/********************************************\
|????歡迎轉(zhuǎn)載, 但請(qǐng)保留作者姓名和原文鏈接, 祝您進(jìn)步并共勉!???? |
\********************************************/
[譯著]在模板方法中的一些"反常"用法
作者: Jerry Cat
時(shí)間: 2006/05/19
鏈接:?
http://m.shnenglu.com/jerysun0818/archive/2006/05/19/7393.html
-------------------------------------
I. Virtually Yours -- Template Method模式
我在研究Wendy寫(xiě)的一個(gè)類。那是她為這個(gè)項(xiàng)目寫(xiě)的一個(gè)抽象基類,而我的工作就是從中派生出一個(gè)具象類(concrete class)。這個(gè)類的public部分是這樣的:
class Mountie {
public:
??? void read( std::istream & );
??? void write( std::ostream & ) const;
??? virtual ~Mountie();
很正常,virtual destructor表明這個(gè)類打算被繼承。那么再看看其protected部分:
protected:
??? virtual void do_read( std::istream & );
??? virtual void do_write( std::ostream & ) const;
也不過(guò)就是一會(huì)兒的功夫,我識(shí)破了Wendy的把戲:她在使用template method模式。public成員函數(shù)read和write是非虛擬的,它們肯定是調(diào)用protected部分do_read/do_write虛擬成員函數(shù)來(lái)完成實(shí)際的工作。啊,我簡(jiǎn)直為自己的進(jìn)步而飄飄然了!哈,Wendy,這回你可難不住我,還有什么招數(shù)?盡管放馬過(guò)來(lái)... 突然,笑容在我臉上凝固,因?yàn)槲铱吹搅似鋚rivate部分:
private:
??? virtual std::string classID() const = 0;
這是什么?一個(gè)private純虛函數(shù),能工作么?我站了起來(lái),
“Wendy,你的Mountie類好像不能工作耶,它有一個(gè)private virtual function。”
“你試過(guò)了?”她連頭都不抬。
“嗯,那倒是沒(méi)有啦,可是想想也不行啊?我的派生類怎么能override你的private函數(shù)呢?” 我嘟囔著。
“嗬,你倒是很確定啊!”Wendy的聲音很輕柔,“你怎么老是這也不行,那也不行的,這幾個(gè)月跟著我你就沒(méi)學(xué)到什么東西嗎?小菜鳥(niǎo)。”
真是可惡啊...
“小菜鳥(niǎo),你全都忘了,訪問(wèn)控制級(jí)別跟一個(gè)函數(shù)是不是虛擬的根本沒(méi)關(guān)系。判斷一個(gè)函數(shù)是動(dòng)態(tài)綁定還是靜態(tài)綁定是函數(shù)調(diào)用解析的最后一個(gè)步驟。好好讀讀標(biāo)準(zhǔn)的3.4和5.2.2節(jié)吧。”
我完全處于下風(fēng),只好采取干擾戰(zhàn)術(shù)。“好吧,就算你說(shuō)的不錯(cuò),我也還是不明白,何必把它設(shè)為private?”
“我且問(wèn)你,倘若你不想讓一個(gè)類中的成員函數(shù)被其他的類調(diào)用,應(yīng)當(dāng)如何處理?”
“當(dāng)然是把它設(shè)置為private的,” 我回答道。
“那么你去看看我的Mountie類實(shí)現(xiàn),特別是write()函數(shù)的實(shí)現(xiàn)。”
我正巴不得逃開(kāi)Wendy那刺人的目光,便轉(zhuǎn)過(guò)頭去在我的屏幕上搜索,很快,我找到了:
void Mountie::write(std::ostream &Dudley) const
{
??? Dudley << classID() << std::endl;
??? do_write(Dudley);
}
嗨,最近卡通片真是看得太多了,居然犯這樣的低級(jí)失誤。還是老是承認(rèn)吧:“好了,我明白了。classID()是一個(gè)實(shí)現(xiàn)細(xì)節(jié),用來(lái)在保存對(duì)象時(shí)指示具象類的類型,派生類必須覆蓋它,所以必須是純虛的。但是既然是實(shí)現(xiàn)細(xì)節(jié),就應(yīng)該設(shè)為private的。”
“這還差不多,小菜鳥(niǎo)。”大蝦點(diǎn)了點(diǎn)頭,“現(xiàn)在給我解釋一下為什么do_read()和do_write()是protected的?”
這個(gè)問(wèn)題并不難,我組織了一下就回答:“因?yàn)榕缮悓?duì)象需要調(diào)用這兩個(gè)函數(shù)的實(shí)現(xiàn)來(lái)讀寫(xiě)其中的基類對(duì)象。”
“很好很好,”大蝦差不多滿意了,“不過(guò),你再解釋解釋為什么我不把它們?cè)O(shè)為public的?”
現(xiàn)在我感覺(jué)好多了:“因?yàn)檎{(diào)用它們的時(shí)候必須以一種特定的方式進(jìn)行。比如do_write()函數(shù),必須先把類型信息寫(xiě)入,再把對(duì)象信息寫(xiě)入,這樣讀取的時(shí)候,負(fù)責(zé)生成對(duì)象的模塊首先能夠知道要讀出來(lái)的對(duì)象是什么類型的,然后才能正確地從流中讀取對(duì)象信息。”
“聰明啊,我的小菜鳥(niǎo)!”Wendy停頓了一下,“就跟學(xué)習(xí)外國(guó)口語(yǔ)一樣,學(xué)習(xí)C++也不光是掌握語(yǔ)法而已,還必須要掌握大量的慣用法。”
“是啊是啊,我正打算讀Coplien的書(shū)...”
[譯者注:就是James Coplien 1992年的經(jīng)典著作Advanced C++ Programming Style and Idioms]
大蝦揮了揮她的手,“冷靜,小菜鳥(niǎo),我不是指先知Coplien的那本書(shū),我是指某種結(jié)構(gòu)背后隱含的慣用法。比如一個(gè)類有virtual destructor,相當(dāng)于告訴你說(shuō):‘嗨,我是一個(gè)多態(tài)基類,來(lái)繼承我吧!’ 而如果一個(gè)類的destructor不是虛擬的,則相當(dāng)于是在說(shuō):‘我不能作為多態(tài)基類,看在老天的份上,別繼承我。’”
“同樣的,virtual函數(shù)的訪問(wèn)控制級(jí)別也具有隱含的意義。一個(gè)protected virtual function告訴你:‘你寫(xiě)的派生類應(yīng)該,哦,可是說(shuō)是必須調(diào)用我的實(shí)現(xiàn)。’而一個(gè)private virtual function是在說(shuō):‘派生類可以覆蓋,也可以不覆蓋我,隨你的便。但是你不可以調(diào)用我的實(shí)現(xiàn)。’”
我點(diǎn)點(diǎn)頭,告訴她我懂了,然后追問(wèn)道:“那么public virtual function呢?”
“盡可能不要使用public virtual function。”她拿起一支筆寫(xiě)下了以下代碼:
class HardToExtend
{
public:
? virtual void f();
};
?void HardToExtend::f()
{
?// Perform a specific action
}
“假設(shè)你發(fā)布了這個(gè)類。在寫(xiě)第二版時(shí),需求有所變化,你必須改用Template Method。可是這根本不可能,你知道為什么?”
“呃,這個(gè)...,不知道。”
“由兩種可能的辦法。其一,將f()的實(shí)現(xiàn)代碼轉(zhuǎn)移到一個(gè)新的函數(shù)中,然后將f()本身設(shè)為non-virtual的:
class HardToExtend
{
// possibly protected
??? virtual void do_f();
public:
??? void f();
};
void HardToExtend::f()
{
??? // pre-processing
??? do_f();
??? // post-processing
}
void HardToExtend::do_f()
{
??? // Perform a specific action
}
然而你原來(lái)寫(xiě)的派生類都是企圖override函數(shù)f()而不是do_f()的,你必須改變所有的派生類實(shí)現(xiàn),只要你錯(cuò)過(guò)了一個(gè)類,你的類層次就會(huì)染上先知Meyers所說(shuō)的‘精神分裂的行徑’。” [譯者注:參見(jiàn)Scott Meyers,Effective C++, Item 37,絕對(duì)不要重新定義繼承而來(lái)的非虛擬函數(shù)]
“另一種辦法是將f()移到private區(qū)域,引入一個(gè)新的non-virtual函數(shù):”
class HardToExtend
{
// possibly protected
??? virtual void f();
public:
??? void call_f();
};
“這會(huì)導(dǎo)致無(wú)數(shù)令人頭痛的問(wèn)題。首先,所有的客戶都企圖調(diào)用f()而不是call_f(),現(xiàn)在它們的代碼都不能編譯了。更有甚者,大部分派生類都回把f()放在public區(qū)域中,這樣直接使用派生類的用戶可以訪問(wèn)到你本來(lái)想保護(hù)的細(xì)節(jié)。”
“對(duì)待虛函數(shù)要象對(duì)待數(shù)據(jù)成員一樣,把它們?cè)O(shè)為private的,直到設(shè)計(jì)上要求使用更寬松的訪問(wèn)控制再來(lái)調(diào)整。要知道由private入public易,由public入private難啊!”
[譯者注:這篇文章所表達(dá)的思想具有一定的顛覆性,因?yàn)槲覀兲菀自诨愔性O(shè)置public virtual function了,Java中甚至專門(mén)為這種做法建立了interface機(jī)制,現(xiàn)在竟然說(shuō)這不好!一時(shí)間真是接受不了。但是仔細(xì)體會(huì)作者的意思,他并不是一般地反對(duì)public virtual function,只是在template method大背景下給出上述原則。雖然這個(gè)原則在一般的設(shè)計(jì)中也是值得考慮的,但是主要的應(yīng)用領(lǐng)域還是在template method模式中。當(dāng)然,template method是一種非常有用和常用的模式,因此也決定了本文提出的原則具有廣泛的意義。]
posted @
2006-05-19 07:23 Jerry Cat 閱讀(673) |
評(píng)論 (1) |
編輯 收藏
/********************************************\
|????歡迎轉(zhuǎn)載, 但請(qǐng)保留作者姓名和原文鏈接, 祝您進(jìn)步并共勉!???? |
\********************************************/
非“偽”隨機(jī)數(shù)的生成
作者: Jerry Cat
時(shí)間: 2006/05/16
鏈接:?
http://m.shnenglu.com/jerysun0818/archive/2006/05/16/7232.html
問(wèn)題的來(lái)由 - "隨機(jī)取m個(gè)數(shù)(在1到n的范圍之內(nèi)),(m <= n),要求m個(gè)數(shù)沒(méi)有重復(fù)。有沒(méi)有
什么好的算法,時(shí)間復(fù)雜度和空間復(fù)雜度都很好"
----------------------------------------------------------------
方案一:
取隨機(jī)數(shù)可以用C++標(biāo)準(zhǔn)的rand,至于M個(gè)不重復(fù),你可以用std::set來(lái)解決,把取道的隨機(jī)數(shù)
插入到set里面,set的size() == m就可以了, 具體可以這樣:
#include <set>
#include <stdlib.h>
int main()
{
?? std::set<int> s;
?? while(1)
?? {
????? int r = rand() % n;
????? s.insert(r);
????? if(s.size() == m)
????? {
???????? break;
????? }
?? }
}
?由于set底層實(shí)現(xiàn)是紅黑樹(shù),插入復(fù)雜度是對(duì)數(shù)級(jí)的^_^
----------------------------------------------------------------
方案二:
#include <iostream>
#include <cstdlib>????? //用于rand()和srand()函數(shù)
#include <ctime>??????? //設(shè)置不同的隨機(jī)數(shù)
using namespace std;
int main (){
??? srand( time( 0 ) );??? //調(diào)用不重復(fù)的隨機(jī)數(shù)函數(shù)
??? unsigned i;
??? for ( int n = 0; n++ < 10; )
??? {
??????? i = rand() ;??????? //對(duì)i 賦系統(tǒng)的隨機(jī)數(shù)
??????? cout << " The NO." << n << "is : " << i << endl;
??? }
??? return 0;
}
1. C++標(biāo)準(zhǔn)函數(shù)庫(kù)提供一隨機(jī)數(shù)生成器rand,返回0-RAND_MAX之間均勻分布的偽隨機(jī)整數(shù)。 RAND_MAX
?? 必須至少為32767。rand()函數(shù)不接受參數(shù),默認(rèn)以1為種子(即起始值)。
?? 隨機(jī)數(shù)生成器總是以相同的種子開(kāi)始,所以形成的偽隨機(jī)數(shù)列也相同。失去了隨機(jī)意義。
2. C++中另一函數(shù)srand(),可以指定不同的數(shù)(無(wú)符號(hào)整數(shù)變?cè)榉N子。但是如果種子相同,偽
?? 隨機(jī)數(shù)列也相同。--一個(gè)辦法是讓用戶輸入種子,但是仍然不理想。
3. 比較理想的是用變化的數(shù),比如時(shí)間來(lái)作為隨機(jī)數(shù)生成器的種子。
?? 在 頭文件ctime中時(shí)間庫(kù)包含time函數(shù),它可以返回一個(gè)表示時(shí)間、日期、月和年的數(shù)值使用如
?? 下調(diào)用可將該值設(shè)為rand的種子
?? srand(static_cast<unsigned>(time(static_cast<time_t*>(NULL))));
4. 但, srand()并不是說(shuō)使隨機(jī)數(shù)都不一樣,它只是使取隨機(jī)數(shù)的種子隨著時(shí)間而改變:)
?? So, 還是方案一好!
posted @
2006-05-16 00:17 Jerry Cat 閱讀(2544) |
評(píng)論 (7) |
編輯 收藏
/********************************************\
|????歡迎轉(zhuǎn)載, 但請(qǐng)保留作者姓名和原文鏈接, 祝您進(jìn)步并共勉!???? |
\********************************************/
作者: Jerry Cat
時(shí)間: 2006/05/16
鏈接:?http://m.shnenglu.com/jerysun0818/archive/2006/05/16/7231.html
類成員函數(shù)指針的一點(diǎn)體悟
類的成員函數(shù)分為兩種,一種是靜態(tài)函數(shù),另外一種是非靜態(tài)函數(shù)。例如:
class X
{
public:
?static void display();
?bool getValue();
}
display()為靜態(tài)函數(shù),getValue即為非靜態(tài)函數(shù)。兩種函數(shù)在使用的時(shí)候是不一樣的。靜態(tài)函數(shù)
可以直接由類名來(lái)調(diào)用,而非靜態(tài)函數(shù)則必須通過(guò)某一個(gè)對(duì)象來(lái)調(diào)用,例如:
X::display();
X x;
x.getValue();
為什么會(huì)出現(xiàn)這樣的情況了?這是由于編譯器在處理這兩種函數(shù)的方式不同造成的。靜態(tài)函數(shù)在
運(yùn)行期只有一份拷貝,所有該類生成的對(duì)象共享該函數(shù)以及該函數(shù)的內(nèi)部變量。而對(duì)于非靜態(tài)函數(shù),
不同的對(duì)象擁有自己的內(nèi)部變量。
在使用類成員函數(shù)指針的時(shí)候同樣也會(huì)不同。
靜態(tài)成員函數(shù)可以當(dāng)作全局函數(shù)來(lái)調(diào)用。
可以定義以下函數(shù)指針:
typedef void (*pf)();
pf p=X::display;
(*p)();? //或p();
也可以當(dāng)作參數(shù)傳遞到全局函數(shù)里:
void Display(pf p)
{
?(*p)();
//或p();
}
Display(X::display);
如果是非靜態(tài)成員函數(shù),其函數(shù)指針則是另一種寫(xiě)法:
typedef void (X::*pf2)();
這一類指針只能用于本類之內(nèi)。
posted @
2006-05-16 00:12 Jerry Cat 閱讀(1175) |
評(píng)論 (2) |
編輯 收藏
/********************************************\
|????歡迎轉(zhuǎn)載, 但請(qǐng)保留作者姓名和原文鏈接, 祝您進(jìn)步并共勉!???? |
\********************************************/
C++對(duì)象模型(7) -? Member Initialization List
作者: Jerry Cat
時(shí)間: 2006/05/12
鏈接:?
http://m.shnenglu.com/jerysun0818/archive/2006/05/12/6978.html
2.4 Member Initialization List
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
When you write a constructor, you have the option of initializing class members either through the
member initialization list or within the body of the constructor. Except in four cases, which one
you choose is not significant.
In this section, I first clarify when use of the initialization list is "significant" and then
explain what actually gets done with that list internally. I then look at a number of possible,
subtle pitfalls.
You must use the member initialization list in the following cases in order for your program to compile:
(1). When initializing a reference member
(2). When initializing a const member
(3). When invoking a base or member class constructor with a set of arguments
???? 低效的第四種情況
In the fourth case, the program compiles and executes correctly. But it does so inefficiently.
For example, given
class Word {
?? String _name;
?? int _cnt;
public:
?? // not wrong, just naive ...
?? Word() {
????? _name = 0;
????? _cnt = 0;
?? }
};
this implementation of the Word constructor initializes _name once, then overrides the
initialization with an assignment, resulting in the creation and the destruction of a temporary
String object. Was this intentional? Unlikely. Does the compiler generate a warning? I'm not aware
of any that does. Here is the likely internal augmentation of this constructor:
// Pseudo C++ Code
Word::Word( /* this pointer goes here */ )
{
?? _name.String::String();???????? // invoke default String constructor
?? String temp = String( 0 );????? // generate temporary
?? _name.String::operator=( temp );// memberwise copy _name
?? temp.String::~String();???????? // destroy temporary
?? _cnt = 0;
}
Had the code been reviewed by the project and corrected, a significantly more efficient
implementation would have been coded:
// preferred implementation
Word::Word : _name( 0 )
{
?? _cnt = 0;
}
This expands to something like this:
// Pseudo C++ Code
Word::Word( /* this pointer goes here */ )
{?? // invoke String( int ) constructor
?? _name.String::String( 0 );
?? _cnt = 0;
}
This pitfall, by the way, is most likely to occur in template code of this form:
template < class type >
foo< type >::foo( type t )
{
?? // may or may not be a good idea depending on the actual type of type
?? _t = t;
}
This has led some programmers to insist rather aggressively that all member initialization be done
within the member initialization list, even the initialization of a well-behaved member such as _cnt:
// some insist on this coding style, 順序有問(wèn)題!
Word::Word() : _cnt( 0 ), _name( 0 )
{}
Actually, there is a subtlety to note here: The order in which the list entries are set down is
determined by the declaration order of the members within the class declaration, not the order
within the initialization list. In this case, _name is declared before _cnt in Word and so is placed first.
This apparent anomaly between initialization order and order within the initialization list can
lead to the following nasty pitfall:
class X {
?? int i;
?? int j;
public:
?? // oops!? do you see the problem?
?? X( int val ) : j( val ), i( j )
?? {}
?? ...
};
// preferred idiom, 解決咯
X::X( int val ) : j( val )
{
?? i = j;
}
Here is an interesting question: Are the entries in the initialization list entered such that the
declaration order of the class is preserved? That is, given
// An interesting question is asked:
X::X( int val ) : j( val )
{
?? i = j;
}
is the initialization of j inserted before or after the explicit user assignment of j to i? If
the declaration order is preserved, this code fails badly. The code is correct, however, 這才是
真正的原因 - because the initialization list entries are placed before explicit user code.
所以成員初始化不是一股腦兒都放到初始化列表里才是最優(yōu)方案!
Another common question is whether you can invoke a member function to initialize a member, such as
// is the invocation of X::xfoo() ok?? 問(wèn)得好!
X::X( int val ) : i( xfoo( val )), j( val )
{}
where xfoo() is a member function of X. The answer is yes, but…. To answer the "but" first, I
reiterate my advice to initialize one member with another inside the constructor body, not in the
member initialization list. You don't know the dependencies xfoo() has regarding the state of the
X object to which it is bound. 還是那句話: 別將所有的成員初始化工作全放在構(gòu)造函數(shù)的初始化列表里 -
By placing xfoo() within the constructor body, you can ensure there is no ambiguity about which
members are initialized at the point of its invocation.
The use of the member function is valid (apart from the issue of whether the members it accesses
have been initialized). This is because the this pointer associated with the object being
constructed is well formed and the expansion simply takes a form like the following:
// Pseudo C++ Code: constructor augmentation
X::X( /* this pointer, */ int val )//一般都將this指針缺省, 但它的確是存在的, 至少對(duì)編譯器而言
{
?? i = this->xfoo( val );
?? j = val;
}
where xfoo() is a member function of X. The answer is yes, but…. To answer the "but" first, I
reiterate my advice to initialize one member with another inside the constructor body, not in the
member initialization list. You don't know the dependencies xfoo() has regarding the state of the
X object to which it is bound. By placing xfoo() within the constructor body, you can ensure
there is no ambiguity about which members are initialized at the point of its invocation.
The use of the member function is valid (apart from the issue of whether the members it accesses
have been initialized). This is because the this pointer associated with the object being
constructed is well formed and the expansion simply takes a form like the following:
// Pseudo C++ Code: constructor augmentation
X::X( /* this pointer, */ int val )
{
?? i = this->xfoo( val );
?? j = val;
}
In summary, the compiler iterates over and possibly reorders the initialization list to reflect
the declaration order of the members. It inserts the code within the body of the constructor
prior to any explicit user code. 成員初始化列表的內(nèi)容"插"在構(gòu)造函數(shù)的最前端.
posted @
2006-05-12 00:49 Jerry Cat 閱讀(813) |
評(píng)論 (0) |
編輯 收藏