




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
精通WindowsAPI(函數、接口、編程實例)下篇目錄\h第10章系統信息的管理295\h10.1inos系統信息295\h10.1.1獲系統版本295\h10.1.2獲計算機硬件信息297\h10.1.3獲系統目錄等信息299\h10.1.4用名、計算機名、域名300\h10.1.5處系統顏色信息、尺度信息等302\h10.1.6鼠、鍵盤等外設信息303\h10.2時間息304\h10.2.1設、獲取系統時間304\h10.2.2獲開機至現在持續的時間305\h10.2.3文時間與系統時間的轉換305\h10.3注冊表306\h10.3.1注表的作用及組織形式306\h10.3.2鍵子鍵、鍵屬性及鍵值的相關操作307\h10.3.3列注冊表項及鍵值309\h10.3.5設隨程序啟動而啟動的調試器(任何程序)312\h10.3.6指程序崩潰實時調試器312\h第1章進程間通信313\h1.1郵槽(Maillot)313\h1.1.1創郵槽、從郵槽中讀取消息313\h1.1.2通郵槽發送消息317\h1.2管道(ipe)318\h1.2.1創命名管道318\h1.2.2管監聽320\h1.2.3使異步I/O進行讀寫321\h1.2.4關管道實例325\h1.2.5客端325\h1.3剪貼板328\h1.3.1獲、設置剪貼板數據328\h1.3.2監剪貼板334\h1.3.3剪板數據格式343\h1.4數據制消息(WM_COPYDA)345\h1.4.1數發送端345\h1.4.2數接收端348\h1.5其他程間通信方式350\h1.5.1動數據交換(DE)和網絡動態數據交換(NDDE)350\h1.5.3indowsSocket351\h第12章ndowsShel程序設計352\h12.1indowsShell目錄管理352\h12.1.1Shell對目錄和文件的管理形式353\h12.1.2我的文檔”等特殊目錄相關操作353\h12.1.3綁、遍歷、屬性獲取354\h12.1.4瀏文件對話框357\h12.2文件助(FileAssociations)358\h12.2.1文類型相關注冊表鍵值359\h12.2.2為件指定默認打開程序359\h12.2.3定文件類型的圖標360\h12.3Sell擴展361\h12.3.1對及概念361\h12.3.2CLSI,處理例程的GUD362\h12.3.3注Shell擴展363\h12.34COM程序開發基礎364\h12.3.5編Handler程序364\h12.3.6Shell擴展程序的調試380\h12.3.7總結381\h12.4任務通知區域ray)圖標381\h12.4.1創圖標窗口382\h12.4.2創圖標和圖標菜單386\h12.4.4彈氣泡通知391\h12.4.5動圖標393\h12.4.6其功能395\h第13章ndowsGDI398\h13.1GI編程接口概述398\h13.11inowsGDI的功能398\h13.1.2鏈庫與頭文件398\h13.2設備下文(C)\輸出操作與圖形對象398\h13.2.1設上下文類型與關聯設備399\h13.2.2圖對象的作用及與DC的關系399\h13.2.3各圖形對象的具體屬性與作用401\h13.2.4繪、填充、寫入等圖形輸出操作402\h13.2.5修與坐標變換403\h13.2.6設上下文的圖形模式403\h13.3一個簡單的DI程序404\h13.3.1示例404\h13.3.2D的操作406\h13.3.3顏的表示407\h13.3.4圖對象:畫刷和畫筆407\h13.3.5輸操作:繪制圖形和線條409\h13.4文字字體409\h13.4.1選、設置字體412\h13.4.2選字體圖形對象413\h13.4.3文的顏色413\h13.4.4輸文字413\h13.4.5C圖形模式設置414\h13.4.6遍字體415\h13.4.7為統安裝、刪除字體文件417\h13.5繪制條417\h13.5.1選畫筆對象417\h13.5.2直線418\h13.5.3繪任意曲線418\h13.5.4跟鼠標軌跡418\h13.5.5弧線424\h13.6繪制形424\h13.6.1填顏色與邊緣勾勒425\h13.6.2繪矩形、橢圓、圓角矩形425\h13.6.3橢弓形和橢圓扇形431\h13.6.4多形431\h13.65RET結構及對RECT的操作432\h13.7位圖作434\h13.7.1截屏幕、保存位圖文件434\h13.7.2將圖顯示在界面上439\h13.8區域(Regions)、路徑(Paths)與修剪(Clip)操作442\h13.8.1區的創建及形狀、位置等屬性442\h13.8.2區邊沿、區域填充、反轉與勾勒操作443\h13.8.3組、比較、移動等操作446\h13.8.4點測試(Hitesting)447\h13.8.5路的創建與操作451\h13.8.6路轉換為區域452\h13.8.7使區域和路徑進行修剪操作,限制輸出452\h13.9坐標換458\h13.9.1縮放459\h13.9.2旋轉460\h13.10調板460\h第14章網絡通信與配置463\h14.1Socket通信463\h14.1.1客端464\h14.1.2服端469\h14.1.3處并發的客戶端連接475\h14.1.4網通信的異步I/O模式476\h14.2IPHeler476\h第15章程序安裝與設置483\h15.11akecab.exe483\h15.1.2壓多個文件484\h15.13Cabinet軟件開發工具包(CASDK)485\h15.2編寫NF文件486\h15.2.1INF文件格式486\h15.2.2Install節488\h15.2.3CopyFiles和AddReg等安裝過程488\h15.2.4源徑和目的路徑489\h15.2.5字串表489\h15.3安裝程序setup.exe編號489\h15.4使用si文件進行安裝493\h15.41indowsInstallerService493\h15.4.2si文件的創建與修改工具orca.exe495\h15.4.3準工作496\h15.4.4編表組496\h第16章設備驅動管理與內核通信497\h16.1設備理497\h16.1.1列設備接口497\h16.1.2監設備的加載和卸載504\h16.2I/o控制、內核通信509\h16.2.1加驅動程序509\h16.2.2控驅動程序、與驅動程序進行通信516\h16.3編寫備驅動程序519\h16.3.1驅程序開發包:DK520\h16.4I/O模式,同步與異步525\h第17章用戶、認證和對象安全527\h17.1基本念527\h17.1.1訪令牌、權限和用戶標識527\h17.1.2進的系統操作權限528\h17.1.3安對象528\h17.1.4訪控制列表(ACL)529\h17.2安全制程序示例530\h17.2.1列進程訪問令牌內容和權限530\h17.2.2修進程的權限536\h17.2.3列安全對象的安全描述符537\h17.2.4修安全描述符543\h17.3用戶544\h17.3.1創用戶544\h17.3.2用組545\h17.3.3刪用戶546\h17.3.4列用戶和用戶組、獲取用戶信息547\h第18章ndowsPI的內部原理554\h18.1關于PI的補充說明554\h18.1.1indowsAPI的版本演進和ista新增API554\h18.1.264位操作系統的接口555\h18.2inos系統中的對象封裝555\h18.2.1什是對象555\h18.2.2面對象的思想555\h18.2.3indows系統中的對象:內核對象、D對象等556\h18.3iFidows程序設計參考:文檔資源與樣例代碼556\h18.3.1SDK文檔和MSDN556\h18.3.2SDK示例代碼556\h18.486臺程序函數調用原理557\h18.4.1函調用的真實過程557\h18.4.2函調用約定561\h18.4.3為么通過參數返回數據時只能使用指針562\h18.4.4緩區溢出562\h18.4.5程運行錯誤的調試技巧562\h18.5可執程序結構與II函數接口內部機理563\h18.5.1indows可執行程序結構563\h18.5.2導表、導出表、動態鏈接565\h18.5.3NTDLL.DLL、NIVEAPI和SSDT566\h18.5.4PIOK568\h18.6發布序569\h18.6.1合選擇編譯鏈接選項569\h18.6.2構到指定路徑569\h18.7模塊,向indowsPl學習接口定義569\h18.71lib件569\h18.7.2頭件570\h18.7.3為三方應用軟件提供SK570第10章系統信息的管理獲取管理的Windows系統信包括系統基本信息、時間信息、注冊表。本章10.1節主要介紹Windows的系統信息的獲取包系統目錄Windows安裝目錄、用戶名、計算機名、域名等。10.2節主要介紹系統時間的獲取和修改。10.3節主要介紹如何操作注冊表。101indows系統信息Windows系統信息包括系統版本目錄計算機名用戶名系統時間系統顏色設置信息等。本節將介紹如何使用API獲取這些信息。首先給出本節所有實例的運行效果,實例10-1~實例10-5的綜合運行結果如圖10-1所示。10.1.1 獲取系統版本1.系統版本的表示與獲取Windows對系統版本的表示分為主版本號次版本號構建(Build)號P主版本號SP次版本號來表示系統版本。比如筆者的主機系統版本號為5.1Build2600ServicePack2。SP版本號會隨著ServicePack的安而改變。一般系統的主版本號與次版本號會對應用程序開發人員有比較大的影響。比如5.0表示Windows000,5.1表示WindowsXP5.2表示WindowsServer20036.0表示WindowsVista。一般每一個新版本的系統都會新增加一些API因此有些API只在新版本的Windows上使用而不能在較老版本的Windows上使用。2.關鍵API與數據結構(1)GeVersionEx。可以使用GetVersionEx函數獲取系統版信息,函數原型如下:
參數lpVersionInfo:輸入、輸出參數,此參數為OSVERSIONINFO或者OSVERSIONINFOEX結構的指針,用于存儲獲取的系統版本信息。這兩個結構的第一個成員都是dwOSVersionInfoSize果使用OSVERSIONINFO結構么將此成員設置為sizeof(OSVERSIONINFO)如果使用OSVERSIONINFOEX結構,那么設此成員為sizeof(OSVERSONINFOEX。
返回值BOOL類型,表示是否成功。使用GetLastError函數獲錯誤代碼。(2)OSVERSONINFOEX構。實例10-1獲取系統版本本實使用GetVersionEx函數獲取系統版本、產品類型等,并打印出結果,以版本所對應的真實版本名稱的形式打印。實例運行結果如圖10-1所示。10.1.2 獲取計算機硬件信息1.獲取硬件相關信息GetSystemInfo函數可以獲取很多系統硬件相關信息包括內存分頁的大小內存的最小分配單位、粒度,處理器的類型和個數等。2.關鍵API與數據結構(1)GetSystemInfo。函數原型如下:
參數lpSystemInfo:輸出參數,獲取的信息保存于SYSTEM_INFO結構中。lpSystemInfo參數為指向SYSTEMINFO構類型變量的指針。
返回值無返回值。(2)SYSTEMINFO結構的定義如下:成員變量的意義見實例8-2。實例10-2獲取系統件相關信息本實使用GetSystemInfo獲系統硬件信息并打印出來包括內存分頁大小處理器數量和類型、處理器架構等。運行結果見圖10-1。10.1.3 獲取系統目錄等信息1.系統目錄和Windows安裝目錄Windows的系統目錄會在安裝的時候確定,在不同主機上運行的系統可能不相同。另外,不同Windows版本其系目錄的默認情況也不是相同的。獲取統目錄使用函數GetSystemDirectory,獲取Windows系統的安裝目錄可以使用函數GetWindowsDirectory。2.關鍵API(1)GetSystemDirectory,函數原型如下:
參數lpBuffer輸出參數保存系統路徑的緩沖區由調用者分配參數uSize為其大(字符數。一般大小為MAX_PATH可。uSize:輸出參數,必須設置為lpBuffer所指向的緩沖區的大小,字符數不能大于lpBuffer緩沖區的大小,否則可能會引起溢出。
返回值如果回值大于uSize,說明沖區小于返回的字符串,返回值為所需的緩沖區大小。如果返回0則表示失敗如果返回非0且小于nSize的值則執行成功返回值大小為系統目錄的字符數。(2)GetWindowsDirectoy。GetWindowsDirectory函數的參數與返回值的意義與GetSystemDirectory函數相似。實例10-3取系統目錄和Windows安裝目錄本實例使用GetSystemDirectory與GetWindowsDirectory函獲取系統相關路徑并打印出來。運行結果見圖10-1。10.1.4 用戶名、計算機名、域名獲取前登錄用戶使用API函數GetUserName獲取計機名使用API函數GetComputerName,獲取特定格式的計算機名使用API函數GetComputerNameEx,設置計算機名使用API函數SetComputerName和SetComputeNameEX.1.關鍵API(1)GetUserName。獲取當前登錄的用戶名:
參數lpBuffer:輸出參數,指向保存登錄用戶名的內存緩沖區。其大小最好不小于(UNLEN+1),UNLEN定在Lmconsh中。nSize:輸入、輸出參數,指向表示lpBuffer的大小(字符數)的DWORD型變量如果小于所需要的大小,那么lpnSize返回需要的大小,函數返回失敗。(2)GetComputerNae。函數定義如下:
參數lpBuffer:輸出參數,指向保存計算機名的內存緩沖區,其大小最好不小于(MAXCOMPUTERNAME一LENGTH+1)。lpnSize輸入輸出參數指向表示lpBuffer的大字符數的DWORD型變量如果小于所需要的大小,那么lpnSize返回需要大小,函數返回失敗。
返回值BOOL型,表示是否成功。使用GetLastError獲取錯誤信息。(3)GetComputerNameEx.除了以獲得計算機名外,還可以獲得NetBIOS或者DNS名,函數定義如下:
參數NameType:所需要取的計算機名的類型COMPTERNAMEFORMAT枚類型詳見示例。其他個參數使用方法與GetComputerName參數相同。
返回值BOOL型,表示是否成功。使用GetLastError獲取錯誤信息。(4)SetComputerName、etComputerNameEx.SetComputerName設置算機NetBIOS名。SetComputerNmeEx可以設置DnsDomain、DnsHostnam、NetBOS。2.實例10-4用戶名、計算機名本實使用GetUserName獲取用戶名使用GetComputerName獲取計機名并演示了GetComDuterNameEx的使用方法。運行果如圖10-1所示。10.1.5 處理系統顏色信息、尺度信息等GetSysColor可以獲取系統中與顏色有關的信息包括桌面顏色窗口顏色等與圖10-2所示“控制面版一顯示一外觀一高級”選項中所能進行的設置相同。函數原型如下:與GetSysColor函數功相對的函數是SetSysColors,可以設置系統顏色。GetSystemMetrics可以獲取系統中各種尺度信息,包括圖標大小(SMYSMICON)、窗標題欄的系統按鈕大小(SM_CYIZE)等。圖10-2所高級外觀設置對話框可獲取和設置尺度大小信息,GetSystmMetricsAPI函數用于對尺度信息獲取,函數原型如下:10.1.6 鼠標、鍵盤等外設信息1.關鍵API與數據結構SystemParameterInfoAPI函數可以設置和獲取多種系統參數,包括Windows輔助功能參數桌面設置參數圖標參數輸入輸出參(包括鼠標鍵盤設置語言設置警告音設置)菜單參數、電源設置參數、屏幕參數。函數定義如下:
參數uiAction是最主要參數需要設置和獲取的系統參數具有種類有很多可參見MSDN和SDK文檔。這個參數也決定了uiParampvParam的設置況。fWinIni:輸入參數指明設置的改變是否發送WM_SETTINGCHANGE消息給當前系統中的窗口程序以及是否修改用戶剖(profile配信息參數可以是SPIF__UPDATEINIFLE或SPIF_SENDCHANGE或組合。
返回值表示作是否成功。使用GetLastError獲取錯誤信息。2.實例10-5鼠標速度本實是使用SystemParametersInfo函數獲取和設置當前系統的鼠標速度實例代碼如下:程序行后,可以感覺到鼠標移動速度有所提升。102時間信息本節介紹如何獲取和設置系統時間。10.2.1 設置、獲取系統時間獲取和設置系統時間使用API函數GetLocalTime、etSystemTime、GetSystemAdjustment、GetSystemTimeAsFileTime和GetSystemTimes等。相應設置函數包括SetLocalTime、SetSystemTime、SetSytemTimeAdjustment等。GetTimZoneInforatin函數可以獲取系統時區設置。SysteTimeoTzSpeciicLocalTime和TzSpecificLocalTimeToystemTime用于標準時間和特定時區的時間之間進行轉換。SetTimeZoneInformation用于設置時區信息。此外還有GetDynamicTimeoneInformation函數。以上API函數在進行操作時,大都使用了SYSTEMTIME結構,用于保存系統時間,此結構定義如下:在涉及時區信息操作時,使用TIME_ZONE_INFORMATION結構表示時信息,定義如下:以上函數的參數設置都較簡單,具體參見實例10-6。實例10-6設置、獲系統時間本實使用本節所述函數獲取系統當前的國際標準時間當前的本時區時間獲取系統所設置的時區,并將時間在各時區內進行了轉換,然后修改系統時間,使其提前1小時。運行結果如圖10-3和圖10-4所示。從運行結果可以看出,實例獲取了當前的系統時間,并將時間提前了一個小時。10.2.2 獲取開機至現在持續的時間GetTickCount和GeTickCount64函數可以獲取系統開機到現在所持續的時間,以ms為單位。使用GetTickCount和GetTickCount64函數獲取開機至現在持續的秒數然后獲取當前時間,并通過轉換計算出系統開機時間。10.2.3 文件時間與系統時間的轉換Windows使用了不同的數據類型來存儲文件時間和系統時間由于文件系統中的每個文件都有若干種文件時間文件時間的數據量很大所以Windows使用了最少的數據來表示文件時間,FILETIME結構的小只有兩個DWORD,結定義如下:可以使用SystemTimeToFileTime和FileTimeToSstemTime將間信息在文件時間格式和系統時間格式之間轉換。文件時間屬性及操作方法見第4章有于這個兩函數的使用詳見第4章文件時間相關的實例。103注冊表本節紹與注冊表相關的操作首先簡單介紹注冊表的組織形式使用注冊表編輯器查閱和修改注冊表然后介紹如何使用程序操作注冊表包括獲取注冊表的內容修改注冊表等。10.3.1 注冊表的作用及組織形式Windows系統使用注冊表來存儲系統和應用程序配置數據。很多系統和應用程序重要的配置的信息都存儲在注冊表中注冊表是一種以樹型結構組織的數據庫樹的每一個節點稱作鍵(key)每個節點可以包含若干子鍵,鍵可以存儲數據,存儲的數據稱作鍵值。一個鍵無論其是否有子鍵都可以有鍵值一個鍵可以有很多個鍵值每個鍵值都有一個名字包含若干數據,所包含的數據類型可以有很多種,表10.1出了注冊表數據類型。系統自帶的注冊表編輯(regedit.exe圖10-5所示以列舉查看修改增加、刪除鍵和子鍵、鍵值。從上可以看出,鍵“HKEYLOCALMACHINE\HARDWARE\DESCRITION\System”有6個鍵值,每個鍵值都有名稱,各鍵值的數據類型不相同,并且,此鍵還具有子鍵。10.3.2 鍵、子鍵、鍵屬性及鍵值的相關操作1.原理在對注表鍵進行操作前,需要使用API函數RegOpenKey、RegOpenKeyEx打開鍵。在打開鍵后,如果需要創建新的鍵,使用API函數RegCreateKey、RegCreateKeyEx。這兩組函數都將返回鍵的句柄(HKEY類型。在得到鍵的句柄后,可以對鍵進行操作。創建子鍵使用前述RegCreateKey、RegCreateKeyExAPI函數刪除鍵使用RegDeleteKeyRegDeleteKeyEx函數egQueryInfoKeyAPI函數獲取鍵多方面的信息包括鍵值子鍵等獲取和設置鍵值還可以使用RegGetValue、RegQueryValueEx、RegStValueEx、RegQueryMulipleValues等函數;刪除指定的鍵值使用RegDeleteValue函數如果需要遍歷子鍵和鍵值,可以使用API函數RegEnumKeyEx和RegEnumValue函數。2.關鍵API(1)ReOpenKeyEx。打開已經存在的鍵,函數原型如下:
參數hKey:輸入參數,需要打開的鍵,可以是RegCreateKeyEx或者RegOpenKeyEx等函數的返回值。可是HKEYCLASSES_ROT、HKEYCURRENTUSERHKEYUSERS、KEYLOAL_MACHINE.lpSubKey:輸入參數,子鍵名稱字符串,如“SOFTWARE\\Microsot\\WindowsT\\CurrentVersion\\ImageFileExecuionOptionS''''。u10ptions:系統保留,調用時設置為0。samDesired:輸入參數,存取權限,可以設置為NULL詳見SDK文檔。phkResult:輸出參數指向保存鍵句柄的HEY類型的變量RegCloseKey關閉鍵時需要這個值。
返回值LONG類型,如果成功返回ERROR_SUCCESS,否則返回FormatMessage函數設置FORMAT_MESAGE_FROM_SYSTM獲取錯信息。(2)ReCreateKey。創建新的鍵,函數原型如下:
參數參數的使用方法可類比RegOpenKeyEx函數的相應參數。
返回值類比RegOpenKeyEx函數的返回值。(3)RegGetValue、RgSetValue.分別為獲取和設置鍵值,RegGetValue函數原型如下所示:
參數Hkey:輸入參數由ReCreateKeyExRegOpenKeyEx等函數獲得的鍵句柄也可以是如下值:HKEY_CLASSES_ROOT、HEY_CURRET_CONFIG、HKEY_CURRENTUSER、HKEY_PERFORMANCENLSTEXT、KEYPERFORMANCE_TEXT、HKEY_USER_HKEY_LOCAL_MACHINE.HKEYPERFORMANCE__DATA.lpSubKey:輸入參數相對于hkey的子鍵如對hkey鍵本身的值進行操作則為NULL。lpValue:輸入參數鍵值名如果為NULL或空字符串則獲取未命名鍵值或默認鍵值。dwFlags:輸入參數類型限制如果指定的鍵值類型不符則執行失敗也可以為設置為RRF_RT_ANY,不做限。參見實例10-1。pdwType:輸出參數類型信息。pvData:輸入參數保存值的緩沖區。pcbData:輸入、輸參數,指向表示pvData緩沖區大小的變量。
返回值LONG類型的數據。如果成功,返回ERROR_SUCCESS;果緩沖區大小不足,返回ERROR_MORE__-DATA。RegGetValue函數原型如下所示:(4)RegDeleteValue。刪除鍵值,函數原型如下:(5)RegDeleteKeyEx。刪除鍵,函數原型如下:實例10-7注冊表操作本實例演示了對注冊表的常規操作,包括打開、創建子鍵、設置鍵值,鍵值類型等。程序行后,在HKEY_CURRENTUSER\otfware鍵下多了一個子鍵MySoftware,并且設置了一個REG_DWORD類的鍵值“TEST”,值為Ox64(100),如圖10-6示。10.3.3 列舉注冊表項及鍵值1.原理遍歷子鍵和鍵值可以使用API函數RegEnumKeyEx和RegEnumValue函數。RegQueryInoKey,RegEnumKeyEx和RegEnumValue相配合可以完成對一個鍵的有子鍵及鍵值的列舉。函數參數設置情況參見實例10-8。2.實例10-8遍歷子鍵和鍵值本實是實例10-7中所調用的QueryKey函的代碼本實例獲取指定鍵下的所有鍵值及所有子鍵。如果將函數進行遞歸調用就可以遍歷注冊表樹。函數將HKEY_CURRENTUSER\Sotfware下的所有鍵打印出來,對比圖10-6和圖10-7,說明結果正確。10.3.4通過注冊表設置一個自啟動的程序10.3.410.3.7小節將說明一些注冊表的應用,都是應用程序開發人員常用的應用方式。本節將介紹通過注冊表設置開機自啟動的程序。程序自啟動有很多種方法注冊表是其中最常用的一種有多個鍵具有這種功能最常用的有:HKEY_LOCAL_MACHINE\SOFTWARE\Micrsoft\WindowsCurrentVersion\Run,只需設置REG二SZ類型的鍵值,將值設置為程序的路徑即可使用程序在系統啟動時自啟動。如果只需要在下次系統啟動時自啟動一次,那么可以設置鍵HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce的鍵值。10.3.5 設置隨程序啟動而啟動的調試器(任何程序)本節將紹如何在程序啟動時加載調試器(讀者也可以用于設置自啟動程序。“HKEY_LOCAL_MACHINE\OFTWAREYMicrosoft,\WindowsNT\CurrentVerso\ImageFileExecutionOptions”下的子鍵可以用于指定啟動調試器。如需要調試os_info.exe,在“ImageFileExecutionOptions”鍵下創建子鍵“os_info.exe”;然后創建鍵值,名為“Debugger”,類型為REG_SZ,數據為啟動調試器的命令行,這里指向Windbg,如:“C:\ProgrmFiles\DebggingToolsorWindows\windbg.exe(可以是何可執行文件,比如notepad.exe在載鍵名稱程序模塊時會首先啟“Debugger”鍵值指定的應用程序,并以鍵名指向的可執行程序為參數。運行os_info.exe就會啟動Windbg運行調試。10.3.6 指定程序崩潰實時調試器本小節介紹如何在程序崩潰時使用調試器用于調試一些特殊的程序在使用Windows時會經常發生程序崩潰的情況程序開發人員可以設置注冊表鍵以在程序崩潰時可以啟動調試器運行調試。一般況下,在程序崩潰后會有如圖10-8所示的對話框。如果單擊“調試”按鈕將會啟動實時調試器,如圖10-9示。可以通過注冊表指定實時調試器,比如指定為WinDBG或OllyDBG等調試器。指定實時調試器的方法為指定注冊表鍵“HKEYLOCALMACHIN\SOFTARE\Microsoft\WindowsNT\Currentersion\AeDebug”的Dbugger”鍵值。第1章進程間通信進程地址空間是私有的出于安全性的目的如果一個進程不具有特殊的權限是無法訪問另外一個進程的內存空間的也無法知道內存中保存的數據的意義但是在一些具體的應用情況下需要多個進行相互配合,有時計算機用戶也需要在多個應用程序之間交換數據。Windows系統下,在進程間通信或共享數據的方式如下。
郵(Mailslot。郵槽最為簡單的進程間數據共享方式一個進程創建并擁有一個郵槽其他進程都可以打開這個郵槽并向其發送消息。11.1節及相關實例介紹了郵槽的使用。
管(Pipe)。實質一種共享的內存由一個進程創建其他進程連接并可進行雙向的通信11.2節及相關實例介紹了管道的使用。
剪板(Clipboard)。剪貼是重要的進程間數據共享方式所有的進程都可以設置和修改剪貼板也都可以從剪貼板獲取內容。11.3節及相關實例介紹了剪貼板使用。
息,具體是指WM_COPYDATA消息。消息具有參數wParam和lParam但是wParam和lParam最多是32位的而WM_COPYDATA消息的參數不受wParam和lParam數據大小的限制,可以用于在進程間傳遞數據。11.4節及相關實例介紹了WM-COPYDATA消息的用方法。
網絡。網絡可以在不同主機上的不同程序間通信,當然也可以在相同主機上的不同程序間通信。
ileMapping第4章已經介紹了FileMapping的使用方法實例4-15已實現了通過Fileapping進行進程間通信的方法。.1郵槽(MailSlot)使用槽通信的進程分為服務端和客戶端郵槽由服務端創建在創建時需要指定郵槽名創建后服務端得到郵槽的句柄在郵槽創建后客戶端可以通過郵槽名打開郵槽在獲得句柄后可以向郵槽寫入消息。郵槽信是單向的只有服務端才能從郵槽中讀取消息客戶端只能寫入消息消息是先入先出的。客戶端先寫入的消息在服務端先被讀取。通過槽通信的數據可以是任意格式的,但是一條消息不能大于424字節。郵槽了在本機內進行進程間通信外在主機間也可以通信但是在主機間進行郵槽通信數據通過網絡傳播時使用的是數據報協議(UDP)所是一種不可靠的通信通過網絡進行郵槽通信時,客戶端必須知道服務端的主機名或域名。1.1.1 創建郵槽、從郵槽中讀取消息首先介服務端的編寫。服務端調用CreateMailslotAPI函數創建郵槽,然后使用GetMailslotInfoAPI數獲取郵槽信息。讀取消息使用ReadFile函數。1.郵槽的命名在本機上郵槽命名的格式為:比如:也可以使用如下格式的命名,用于在不同主機間的進程通信。可以使用通配符,以進行廣播。2.關鍵API(1)CreateMailslot。CreateMailslot函數的功能是創建一個郵對象,CreateMailslot函數的原型如下:lpName:參數是郵槽名。nMaxMessageSize:制了最大消息長度。lReadTimeout:限制了讀超時的時間(ms),也可設置0(如果沒有消息立即返回)或MAILSLOT_WAIT_FOREVER(直到讀到消息才返回。lpSecurityAttributes:安全屬。(2)GetMailslotIno。GetMailslotInfo函數的功能是獲取郵槽的相關信息,函數原型如下:GetMailslotInfo數獲取了郵槽的相關信息,包括通過lpMaxMessageSize參數返回的消息最大的長度通過lpNextSize消息返回下一條消息的長度通過lpMessageCount返回的消息數量,通過lpReadTimeout返回的讀時時間。(3)SetMailslotIno。另外郵件被創建后仍然可以修改讀操作時間超時時間通過APISetMailslotInfo函數設置。3.實例11-1郵槽通信服務端程序本實例中創建了一個名為“\\\\.\\mailslt\\sample_ailslot”的郵槽,然后使用GetMailslotInfo函數讀取消息數量如果沒有消息則等待20s獲信息循環直至有消息到達,然后一次性讀出全部消息。這種式只有在固定的時間間隔才讀取如果需要在有消息到達時立刻獲得消息可以將讀操作超時時間設置為MAILSLOT_WAITFOREVER,然后調用ReadFile,ReadFile在有消息可讀時才會讀取消息并返回。1.1.2 通過郵槽發送消息客戶端郵槽發送消息需要首先打開郵槽然后直接使用WriteFile函數寫入打開郵槽使用CreateFile函數。客戶端在打開郵槽需要知道郵槽名。1.實例11-2郵槽通信服務端程序本實打開了名為\\\\.\\mailslot\\sample_mailslot郵槽然后寫入了一條消息。消息的內容是“TestMesageformailslot”。2.實例11-1、11-2運行結果進行服務端程序,再運行客戶端程序(可運行多次,客戶端程序運行結束后退出,服務端程序輸出如圖11-1所示。.2管道(Pipe)管道一種用于在進程間共享數據的機制其實質是一段共享內存Windows系統為這段共享的內存設計采用數據流I/0的方式來訪問由一個進程讀另一個進程寫類似于一個管道兩端,因此這種進程間的通信方式稱作“管道。管道為匿名管道和命名管道。匿名道只能在父子進程間進行通信不能在網絡間通信而且數據傳輸是單向的只能一端寫,另一端讀。命令道可以在任意進程間通信通信是雙向的任意一端都可讀可寫但是在同一時間只能有一端讀、一端寫。由于令管道更具有通用性,本節介紹命名管道。1.2.1 創建命名管道創建名管道有專門的API函數。1.關鍵APICreateNamedPiDe是用于創建命令管道的API數,原型如下:
參數lpName參數:管道名。命名方式如下所示:dwOpenMode參數是打開模式。包括存取模式、I/0式等,其值如表11.1所示。dwPipeMode參數:管道模式,包括管道類型模式、管道讀模式和管道等待模式。管道類型模式有PIPE_TYPE_YTE或PIPE_TYPEMESSAGE,如果設置為前一種模式,那么所有寫入管道的數據都是以連接字節的形式存在,而后一個模式,系統會將每一次調用WriteFile寫入管理的數據作為一個消息,管道中的內容是分塊的。管道讀模式可以是PIPE_-READMODE_YTE或者PIPE_READMODEMESSAGE,分別表示從管道中讀取的信息是連續的還是以獨立消息的形式存在的。等待模式可以是PIPE_WAIT或者PIPE__NOWAIT,分表示讀寫操作是否阻塞(是否在無數據時立刻返回。nMaxInstances參數表示指定了一個pipe所能立的最多的實例同名的pipe可以被創建多次,一次稱作一個實例,每個實例可以接收一個連接。nOutBufferSze和nInBufferSize:別是輸出和輸入的緩存大。nDefaultTimeOut:超時間。lpSecurityAttributes:安全屬性。
返回值返回創建的管道的句柄。2.實例11-3創建命令管道以下代創建了一個名為“\\\\.\\pipe\\samlenamedpipe”的管道這是一個用于本機內兩個進程通信的管道設置了存取模式為可讀可寫而且采用了異步重疊模式(FILEFLAG_OVERLAPPED),管道類型為消息型,讀取時也是按消息讀取。代碼中的CreateAndConnectInstance函數最后調用了ConnectToNewClient函數監聽客戶端的連接。ConnectToewClient函數實例代見11.2.2小節。1.2.2 管道監聽ConnectToNewClient函數功能是監聽戶端的連接用了API函數ConnectNamedPpe。1.關鍵APIConnectNamedPipe函數是pipe服端用于等待客戶端連接的函數,函原型如下:參數hNamedPipe是pipe句柄,直接使用CreateNamedPipe函數的返回值即可。lpOverlapped是指向OVERLAPPED結構的指如果在創建管道時指明了I/O模式為重疊的(lpOverlapped),么必須指定本參數;否則設置為NULL。2.實例11-4創建命令管道本實調用了ConnectNamedPipeAPI函數。當有客戶連接時,函數返回,后根據返回值判斷狀態。1.2.3 使用異步I/O進行讀寫本書前章節在使用到I/O時例如文件I/O時,都是用同步I/O模式,在使用異步I/O時,先了解以下基本概念。1.110模式由于些進程間通信的方法(pipe)涉及到了Windows系統的I/O模式I]O模式不僅在進程間通信時使用任何具有數據流形式的輸入輸(包括文件輸入輸出內核通信網絡輸入輸出等)都涉及I/O模式。異(Asynchronous)和同步Synchonous)I/O是兩種基本的I/O模式。其中涉及許多細節,同步I/O和步I/0的詳細區別,本書將在16.4節介紹。由于第4章第14章和第16章分別介紹了文件I/O和網絡I/O和設備I/O內通信。在學習這部分內容時可以和相關章節相聯系。2.異步I/O所謂步I/O是指在調用ReadFileWriteFile等函數進行入輸出操作時系統完成了輸入輸出ReedFileWriteFile才返回在操作系統進行I/O操作的過上用戶態線程不能執行,因此在同步I/O時,如果需要在I/0時進行其他操作就只能再開啟線程。而異步I/O是在用ReadFileWriteFile等函數后函數立即返回線程可以進行其他操作。剩下的I/O操作在系統內核中自動完成。那么在系統內核完成輸入輸出后,程序如何知道I/O是否已完成?在本實例中采用了一種方法,稱作完成函數(CompletionRoutines,如果使用ReadFileEx、WriteFileEx等進行I/O,可以指定完成函數,所謂完成函數是指內核在完成I/O后,內核會回調這個函數。當完成函數被調用時,就指明內核已經完成了I/O,程序可以在這個函數中進行一個I/O完后需要的操作(例如釋放內存。實例11-5就使用了種方式。3.實例11-5對Pipe進行讀寫讀和操作的完成函數如下所示:在讀操作完成后,調用讀操作的完成函數CompletedReadRoutine。而CompletedReadRoutine函數又開始新的寫操作。在CompletedReadRoutine函數進行的寫操作I/O完成后寫操作的完成函數CompletedWriteRoutine被調用,而正是在CompletedriteRoutine中進行的寫作。如果環往復,形成交替讀寫的流程。下面來分析讀寫操作循環的入口點。分析maIn函數:在maln函數中進行了一次CompleteWriteRoutine函數調用。這次調用開始了循環交替讀寫。在調用CompletedWriteRoutine之前,mam函數還行若干與重疊I/O相關的操作。CompletedReaRoutne函數調用了GetAnswerToRequest函數,GetAnswerToRequest函數用于處理不同的客戶端輸入可以根據不同輸入給出不同的反饋在本實例中對所有輸入都回復"Defautanswerfromserver"。各函之間的參數傳遞主要是通過PIPEINST結構傳遞,定義在maln函數之前。1.2.4 關閉管道實例如果在讀寫過程中發生了錯誤服務端程序會斷開管道的連接并關閉實例句柄關閉連接使用API函數DisconnectNamedPipe,參數為實例句柄。1.2.5 客戶端與服務相比客戶端實例程序的功能相對較簡單首先是打開命名管道獲得句柄然后向管道中寫入數據,之后等待服務端的回復。1.原理與關鍵API在實例11-6中,首先有一個while循環,本循環在客戶端成功打開命名管道(管道名需與服務端所創建的一致后結束如果打開管道時管道繁忙將等待一段時間再連接或者在程序發生錯誤時直接退出。打開名管道使用的函數是CreateFile調用CreateFile時服務端會收到客端的連接請求,打開成功后會連接管道。等待一個管道變為可用狀杰的API函數是WaitNamedPipe。WaitNamedPipe函數一直等待,直到管道實例可用或者超時。如果程序成功連接到服務端使用SetNamedPipeHandleState函數設置管道的讀寫模式由于客戶端使用CreateFile函數打開管道,而在打開時法指定讀寫模式,因此在打開成功后要再調用SetNamedPipeHandleState函數設置讀寫模式實例中設置為以消息方式讀。SetNamedPipeHanleState函數原型下:hNamedPipe參數是道句柄lpMode用于設置管道的模式lpMaxColletionCount和lpCollectDataTimeout用于設置數據的緩存大小,在同一主機進程間通信時無意義。2.實例11-6管道通信客戶端程序管道信和客戶端實現代碼如下:3.運行結果先運行服務端程序,再運行客戶端程序。客戶端程序可以運行多次。運行兩次服務端程序,程序運行結果如圖11-2所示。客戶端程序運行結果如圖11-3所示。.3剪貼板剪貼是最常用的系統特性之一計算機用戶在使用計算機時經常會使用到剪貼板剪貼板由系統定義并不屬于任何一個特定的進程系統中所有進程都可以訪問和設置剪貼板。很多具有“復制“貼”功能的文字編譯程序都是通過剪貼板進行操作的。剪貼最大的特點就是數據傳輸沒有明確的目標數據是被動訪問的設置剪貼板的程序并不知道所設置的數據什么時候被訪問也不知道被哪個進程訪問剪貼板中的內容也可以多次訪問,直到新的數據寫入。正是此特性決定了剪貼板便于計算機用戶進行直接操作。因此過剪貼板也是一種可供選擇的進程間通信方式但是由于系統中任何一個進程都可以無限制地訪問剪貼板,剪貼板也是一種不可靠的通信方式。本節中11.3.1小節通過實例介紹了對剪貼板的基本操作,包括設置剪貼板中的數據、從剪貼板獲取數據等。11.3.2小節通過實例介紹了如何對剪貼板的修改進行監視,這種機制可以使用程序及時發現剪貼板中的數據變化。使用通過剪貼板傳輸數據可以具有實時性。11.3.3小節介紹了剪貼板中數據的格式及自定義數據格式的方法。1.3.1 獲取、設置剪貼板數據系統提供了專門的API函數來設置和獲取剪貼板,包括OpenClipboard、EmptyClipboard、etClipboardData、GetClipboardData、CoseClipboard等。1.關鍵API(1)OpenClipboard。OpenClipboard函數的功能是打開剪貼板獲得剪貼板的句柄后續所有對剪貼板的操作都需要該句柄。函數原型如下:參數hWndNewOwner定了與剪貼板句柄相配合的窗口句柄。指定的窗口可以收到剪貼板操作所產生的消息(參見11.3.2小節,如指定NULL采用當前任務的窗口。(2)EmptClipboard。在得到剪貼板句柄后,可以對剪貼板進行操作。EmptyClipboard的功能是清空剪貼板中的內容,無參數。(3)SetCliboardData。SetClipboardData函數的功能是設置剪板內容,函數原型如下:uFormat參數指定了數據的格式可以是標準系統格式也可以是用戶自定義格式剪貼板的數據格式見11.3.3小節。hMem是需要設置的數據的內存句柄。需使用全局內存管理的函數分配和設置,且在分配時需指定GMEM-一MOVEABLE標志(參考第5章。(4)GetClipboardData。GetCliDboardData函數功能是從剪貼板獲取數據,函數原型如下:參數uFormat指定獲取的數據的格式獲取的數據使用句柄返回根據設置的格式不同,返回的數據類型不同。如果指定為CF_TEXT,回的是字符串指針。2.實例11-7管道通信客戶端程序本實例ClipText.exe演示了對文本復制粘貼等操作程序包括一個窗口一組菜單。菜單中包括“復制剪切“貼”等項。在單擊菜單后作相應的處理。程序在窗口客戶區顯示文本,顯示的文本由全局變量lpszText指定。在窗口消息處理函數每次收到窗口繪制(WM_PAINT)函數時,調用DrawTextAPI函數將字符串顯示在客戶區(原理參第13章GDI相關內。如果通過菜單輸入“復制”(命令ID為IDMCOPY),序調用SetClipboardData函數將窗口上顯示的內容(lpszText)設到剪貼板由于本程序只支持文本操作所以將格式設置為CF_TEXT。如果輸入的命令是“剪切”(命令ID為IDM_CUT),除了成復制的功能處,還將lpszText字符串釋放。如果過菜單輸入“粘貼(命令ID為IDM_PASTE程序調用GetClipboardData從剪貼板中獲得數據,賦值給lpszText。然后在界面上顯示內容。為了到顯示的效果,本實例直接使用GDI接口函數在主窗口的客戶區上繪制出文本,而沒有采用本身就具有剪貼板操作功能的EDIT、RichEdit等控件。3.運行結果運行實例后可以從其他應用程序復制數據到本程序也可以從本程序復制數據到其他應用程序。參見圖11-4和圖11-5。1.3.2 監視剪貼板實例11-7中的程序在通過剪貼板進行數據通信時不具有實時性所有操作都依賴于用戶。如果要立即知道剪貼板中的內容變化,需要使用剪貼板查看器(Viewer)。1.原理與關鍵API(1)WM_DRAWCLIPBOARD消息。系統供了WM_DRAWCLIPBOARD消息用于監視剪貼板的變化。如果調用SetClipboardViewer函數設置了窗口為剪貼板查看器,那么當剪貼板中的內容變化時,所注冊的查看器窗口會收到WM_CHANGECBCHAIN消息和WM_DRAWCLIPBOARD消息。當剪板中的內容變化時,窗口會收到WMDRAWCLIPBOARD消息。當查看器鏈表中有新的節點加入或有節點退出窗口會收到WM_CHANGECBCHAIN消息。(2)SetClipboardViewer函數原型如下:hWndNewViewer參數指定了監視窗口,也即是用于接收WM_CHANECBCHAIN消息和WM_DRAWCLIPOARD消息窗口。2.實例11-8剪貼板查看器本實例ClipView.exe是一個剪貼板查看器在窗口創建(WM_CREATE消息用了API函數SetClipbardViewer將程主窗口設置為查看器。窗口收到WM_CHANGECBCHAIN時根據情況更新鏈表。窗口在收到WM.DRAWCLIPBOARD消息后調用了SetAutoView數,而SetAutoView函數,在調用GetPriorityClipboardFormatAPI函數獲得剪貼板中數據的主要格式后,調用UpdateWindow刷新窗口。因此,一旦剪貼板變化,ClipView.exe的窗口就會刷新。而如本實例代碼所示,而窗口刷新過程(WM_PAINT消息)中,程序會獲取剪貼板中的數據,并根據剪貼板數據的格式進行顯示。本實例主要演示了如何監視剪貼板內容的變化;同時還演示了如何使用剪貼板數據格式。數據格式的相關原理解釋參見11.3.3小節。3.運行結果如圖11-6示,運行ClipView.exe,如果截屏,那么會顯示所截獲的位圖。如果在Word中復制數據那么可以顯示所復制的文本文件具有格式果如圖11-7所示。1.3.3 剪貼板數據格式剪貼板可能會存在各種各樣的數據因此剪貼板中在保存數據的同時還需要保存數據的格式信息。系統用一個UINT類型的數據來表示剪貼板中的數據格式。在這格式信息中有很多是各種應用程序之間通用的比如文本位圖等這些數據格式已經由系統預先定義,稱為標準格式。當然一些應用程序也希望自行定義剪貼板的數據格式這樣可以方便地在同一個應用程序的不同實例間進行數據傳遞而不需要對數據的格式進行過多的處理(典型的就包括Word)。1.標準格式標準式有很多種,表11.2列舉出最為常用的幾種。2.自定義格式如果需要自定義格式,那么調用RegisterClipboardFormatAPI函數,函數型如下:在調時,便用lpszFormat參數指定一個格式名,函數會返回系統為其分配的格式類型值(UINT)。3.多種格式在很情況下,數據的格式不止一種,比如格式化的文本(如從Word中復制的數據、從網頁中復制的數據等)有效的格式不止一種,就可能會具有多重格式。以下個API函數都是用于獲取當前剪貼板中格式信息。(1)GetPriorityClipboardFormt.GetPriorityClipboardFrmat函數的功能是檢測剪貼板中是否有特定格式的數據,函數原型如下:檢測否有paFormatPriorityList參數所指定的格式數組中的格式,如有則返回數組中的第一個剪貼板前具有的格式。cFrmats是paFormatPriorityList數組的小。(2)CountClipboardFrmatS。CountClipboardFormts函數返回當前剪貼板中的具有的不同格式的數量,函數原型如下:(3)EnumClipboardFormatS。EnumClipboardFormats函數可以列舉當前剪貼板中的所有格式,函數原型如下:通過format參數指定一個已知的格式,通過返回值返回下一個格式。(4)GetUpdatedClipboardFormatSaGetUpdatedCipboardFormats函數取當前剪貼板的所有格式,函數原型如下:lpuiFormats參數指向用于保存返回的格式數組的緩存。cFormats表示lpuiFormats可以容納的格式信息的數量,即lpuiFormats數組的大小。pcFormatsOut返回真實的數組大小。4.剪貼板數據的格式信息每一個剪貼板格式都有一個格式名,格式名是一個字符串,使用GetClipboardFormatNameAPI函數可以獲得。GetClipboardFormatName函數型如下:.4數據復制消息(WM_COPYDA)WM_COPYDATA是一個非常特殊的消息此消息可能攜帶一個比較大的消息參數而其他消息都只能攜帶兩個固定大小的參數(WPARAM和LPARAM)。在發送WM_COPYDATA消息時,WM_COPYDATA的wParam參數應該賦值為發送此消息的窗口,而lParam消息數指向一個COPYDATASTRUCT結構類的變量。COPYDATASTRUCT結構如下:dwData可以是任意值lpata是需要發送給目錄窗口所在進程的數據cbData字符指定了lpData內存區域的字節數也是需要發送給目標進程的lpData所指向的數據的大小。在消發送時,系統會將整個COPYDATASTRUCT及lpData所指向的內容全部發送給目標進程。目標進程窗口在收到WM—COPYDATA后,可以從lParam參數提取出數據。1.4.1 數據發送端下面通實例說明WM_COPYDATA消息的使用,實例11-9是使用WM_COPYDATA消息的消息發送端。實例11-9發送WM_COPYDATA消息實例序創建了一個文本框控件,用戶可以在控件中輸入文字,單擊“Send”按鈕后,向窗口名為“RECVCOPYDATA”的口發送WM_COPYDATA消息,將用戶在文本框中輸入的內容全部發送給“RECVCOPYDATA”口。運行實例,用戶可以輸入任何內容,單擊菜單中的Send,如果存在名為“RECVCOPYDATA”標題的窗口,則向其發送數據。1.4.2 數據接收端實例11-10是ⅥrM_COPYDATA消息接收端。實例11-10接收WM_COPYDATA消息實例創了名為“RECVCOPYDATA”的窗口,并創建了一個文本框控,在主窗口收到WMCOPYDATA消息后,將消息的lParam消息提取出來,顯示在文本框中。程序接收到消息后,將消息提取并顯示內容。運行果表示,接收端收到了發送端發送的消息,并收到數據。.5其他進程間通信方式本節單介紹幾種其他的進程間通信方式包括動態數據交換FileMapping和Socket等。1.5.1 動態數據交換(DDE)和網絡動態數據交換(NDDE)DDE可能是最為強大的進程間通信方式實現也非常復雜通信的兩端分為服務端與客戶端,兩端都需要具有窗口。一個DDE的通信過程大致如下。DDE會由客戶端發起,先初始化一個會話。DDE客戶端會向服務端發送一個WM_DDEINITIATE窗口息。服務窗口收到此消息后,根據條件判斷是否需要響應此消息,如果服務端確定可以與客戶端建立會話,那么會返回WM__DDE_ACK消息。如果客戶端成功收到了服務端發送的WM—DDE-ACK窗口消息,那么會話就已經建立,之后就進行數據的傳輸。數據輸分為很多種方式可以只傳輸一個單獨的數據項也可以再建立一個永久數據連(PermanentDataink)。如果行獨立數據項傳輸,數據傳輸的單位是數據項。客戶端使用WM_DDE_REQUEST和WM_DDE_POKE消息向服務端接收和發送數據項。數據的傳輸使用WM_DDE_DATA息。而永數據連接的建立也是通過客戶端發起客戶端服務端發送WMDDE_ADVISE消息,服務端根據情況做出回應,根據是否能夠建立連接而返回不同的WM_DDE_ACK消。終止數據連接使用消息WM_DDE_UNADVISE。客戶還可以使用WM_DDE_EXECUTE請服務端發送命令。終止個DDE會話使用WMDDE_TERMINATE消息。幾乎有的過程都是由客戶端發起請求而服務端響應服務端響應的方向大多是發送一個WM__DE_ACK消息。DDE的信需要操作系統ATOM表的幫助,用于索引據。操作ATOM表有專門的API。11.5.2通過FileMapping在進程間共享數據共享件是一種高效的進程間通信方式因為直接共享內存所以訪問速度非常快而且允許大量數據傳輸。共享存的進程間通信與其他進程間通信方式相比限制條件要少比如郵槽對數據大小和數據流向有限制,管道只能采用半雙工通信形式等,剪貼板容易受其他進程影響等。本書4.4.2小節已經詳細介紹了通過FileMapping進行進程間數據共享的完整的實現原理和實例代碼。使用FileMapping享數據也有缺點。最大的缺點是無法實現實時性,一個進程無論是寫入還是讀出數據后,另一個進程都不知道對方的操作是否已經完成。因此在要求實時數據傳輸時,FileMapping通常與其他進程通信方式配合使用,用于傳輸大量的數據。1.5.3 indowsSocket利用WindowsSocket實現的進程間通信完全借用了Socket通信的原其實任何可以在兩臺主機間進行網絡數據通信的機制都可以用于進程間通信。如果一臺主機上既使用Socket服務端又現Socket客戶端那么客戶端在連接服務端時將IP指定為本機,就可以實現同一主機上的Socket務端進程和Socket客戶端進程間的通信了。使用Socket進行進間通信既可以實現實時性,又可以傳輸大數據量信息,且數據傳輸的速度也很快,因此應用范圍很廣泛。在進程間實現Socket通信的原理和程序實現方法與實現不同主機間的Socket通信沒有區別,請參考本書第14章相關內容。第12章indowsShell程序設計幾乎有的操作系統都有“Shell”的概所謂Shel(殼一般是指由操作系統提供的用于計算機用戶向操作系統輸入相關指令并得到結果的程序Shell可以字符形式的,也可以是圖形界面形式的。本章所介紹是圖形界面形式的Shell。WindowsShell最重要的組成部件是explorer.exe。在使用Windows操作系統時,開始菜單、任務欄、資源管理器等都是explorer.exe提供的。因此Shell程序設也是圖形用戶界面設計的重要組成部分掌握Shell程序計需首先了解下面4個方的內容。(1)WindowsShell編程接口。WindowsShell提供系列編程接口,例如可以獲取特殊文件夾,使用文件瀏覽對話框等。Shell編程接口的函數名通常是以“SH”開始。(2)WindowsShell擴展。Windows平臺的Shell是可擴展的。可以為WindowsShell開發擴展程序(Extention),例如:
定不同類型的文件的右鍵菜單拖拽菜(比如WinRARAdobeArobat應用程序具有這樣的功能;
開發系統通知區域圖標并為圖標定制菜單和氣泡彈出功能(QQSNVisualStudio等應用程序具有這樣的功能);
定任務欄、定制工具欄等;
增自動播放對話框中的選項;
添控制面板項;
為同文件類型文件屬性頁、文件夾的屬性頁(右鍵屬性)增加選項頁。上面幾種典型的Shell擴展應用但是Shell擴展應用遠不止這幾種情況本章將介紹其中幾種的實現方法。(3)注表在Shell應用中具有重要作用。Shell應用在很大程度上依賴于注冊表,舉例如下。
文類型輔助:特定擴展名的文件的圖標、默認打開程序等是通過注冊表來配置的。
Shell擴展的安裝:比如特定類型文件的右鍵菜單、拖拽菜單(ContextMeun)的菜單項及輸入處理函數所在的動態鏈接庫。(4)相頭文件和庫文件。進行Shell程序的設計,需要使用一些頭文件和庫文件。一般ShellAPI都在shlobj.h頭文件中聲明,由She1132.dll導出鏈接時需要使用到She1132.lib庫。12.1indowsShell目錄管理計算用戶使用Shell最常進的操作就是文件操作Shell最重要的功能之一是進行文件瀏覽、查找、管理以及將文件和應用程序關聯。WindowsShell中有多特殊目錄和文件,比如所有Windows用戶都經常接觸到的“我的文檔桌面“收站“序件”(Programfiles)等。這些錄都是Shell特殊目錄。可以通過Shell程序設計接口開發程序,獲取和操作這些特殊目錄。12.1.1 Shell對目錄和文件的管理形式Shell有一種特殊的件和目錄管理方式,每個目錄都有一個PIDL(PointerofItemidentifierlist,項識符表指針)值,這個值惟一標識一個文件夾。由系定義的特殊文件夾的CSIDL(constantspecialiemIDlist)是常數,比如:CSIDL_DESKTOP代表“桌面”文件夾;CSIDL_FAVORITES代表“收藏夾”;CSIDL_FONTS代表字體文件夾;CSIDL_MYDOCUMENTS,代表“我的文檔”;CSIDL_MYMUSIC代表“我的音樂”;CSIDLPROFIE代表“用戶”文件夾,一般情況下是C:\DocumentsandSettings\username;CSIDL_PROGRAMS代表“程序”文件夾,一情況下是C:\ProgramFiles;.CSIDLRECENT,代“最近的文檔”;CSIDL_STARTMENU,代表“開始菜單”目錄;CSIDL_SYSTE、CSIDL_WINDOWS分別代表“系統”和“Windows”目。SHGetNameFromIDList、SHGetPathFromIDist等ShellAPI函數通過CSIDL獲得有關于目錄的詳細信息。12.1.2 “我的文檔”等特殊目錄相關操作本節通過示例說明系統特殊目錄的操作。1.關鍵API及數據(1)SHGetSpecialFlderPath函數。通過件夾的CSIDL,獲得文件夾的路徑,函數原型如下:(2)SHGetFolderocation函數。獲取文件夾的路徑,并保存在ITEMIDLIST結構,函數原型如下:(3)SHGetPathFrmIDList函數。從PIDL轉換為路徑函數原型如下:2.實例12-1獲取并顯示“我的文檔”等特殊目錄本實使用了若干表示系統特殊目錄的CSIDL常數通這些常數獲取文件夾的真實路徑,并顯示。本實例使用了兩種方法來獲取特殊文件夾的路徑,一種是直接使用SHGetSpecialFolderPathAPI,另外一種更為通用,使用SHGetFolderLocation從PIDL或CSIDL獲得文件夾位置后,再使用SHGetPathromIDList獲取文件路徑字符串。3.運行結果本實的運行結果參見12.1.3小節的圖12-1。12.1.3 綁定、遍歷、屬性獲取本小節將通過實例介紹通過ShellAPI編寫更一般的文件操作程序,包括
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 深入解析計算機二級Msoffice試題及答案
- 信息處理技術員應試試題及答案
- 軟件版本控制管理試題及答案
- 體驗式學習在備考中的應用2025年計算機二級VB考試試題及答案
- 高效學習邏輯的方法試題及答案
- 血栓的預防及護理
- 預防骨髓抑制的中醫護理策略
- 2025年教育系統師生談話范文
- 生物醫學大數據實驗室共建與數據挖掘協議
- 內科急救職責及應急管理
- 2025-2030中國充電機器人行業市場現狀分析及競爭格局與投資發展研究報告
- 胸腺瘤切除術后的護理
- dl∕t 5491-2014 電力工程交流不間斷電源系統設計技術規程
- (完整版)總局關于發布醫療器械分類目錄的公告(2017年第104號)新版本醫療器械分類目錄2018版
- 房屋建筑工程竣工驗收技術資料統一用表(2024 版)
- 公安指揮中心業務培訓
- 康復醫學科治療技術操作規范2023版
- 磷酸鐵及磷酸鐵鋰異物防控管理
- 大學生創業計劃書:燒烤店
- 企業重組及股權結構調整方案
- DB13-T5723-2023主要農作物自然災害損失評估指南
評論
0/150
提交評論