C++Builder的60個(gè)編程資料_第1頁(yè)
C++Builder的60個(gè)編程資料_第2頁(yè)
C++Builder的60個(gè)編程資料_第3頁(yè)
C++Builder的60個(gè)編程資料_第4頁(yè)
已閱讀5頁(yè),還剩103頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

C++Builder的60個(gè)編程資料6、用C++Builder3制作屏幕保護(hù)程序7、TCP/IP頭格式8、UDP9、判斷windows的Desklop及其它H或10、取得本地internet機(jī)器的名字及IP地址11、用C++Builder創(chuàng)建數(shù)ア簽名12,JUEnter鍵控制焦點(diǎn)切換的方法13,攔截Windows消息14,使用CommaText15,程序開(kāi)始時(shí)先顯示信息機(jī)16,怎樣荻収程序的命令行參數(shù)?17,如何監(jiān)視剪貼板18,如何使用Onldle事件19、用C++Builder編寫(xiě)屮行異步通信程序20,C++BUILDERIE可視組件的消息處理技巧21,用C++Builder建立數(shù)據(jù)庫(kù)VCL使用經(jīng)驗(yàn)22,用C++Builder創(chuàng)建法」Internet的點(diǎn)對(duì)點(diǎn)Chat23,用C++Builder獲取應(yīng)用程序圖標(biāo)24,BIG5到GB的轉(zhuǎn)換技術(shù)25、C++BUILDER計(jì)你的任務(wù)欄圖機(jī)動(dòng)起來(lái)26、TFORM27,JljBCB(\windows臬而創(chuàng)建快旋勿式28、讀磁片磁區(qū)29、I/O2口讀寫(xiě)的實(shí)現(xiàn)30、冷測(cè)鼠標(biāo)位置31,令Win32應(yīng)用程用跳入系統(tǒng)竽層32,如何取得Memo的行和列33,使用Sockets34、Windows95/98卜怎樣障藏應(yīng)用程序不讓它出現(xiàn)在CTRL-ALT-DEL對(duì)話框中?35,怎樣隱藏應(yīng)用程序的任務(wù)條圖標(biāo)36,編寫(xiě)自己的Ping.exe程序37,JHC++Builder<\WINNTト編制個(gè)Service38,加何在C++BUILDER中自動(dòng)關(guān)閉WINDOWS屏保39、顯示ノ隱鱷任務(wù)欄圖標(biāo)40,信箱監(jiān)視程序41、C++Building制作鬧鐘42,撥號(hào)上網(wǎng)IP地址的檢知43,用C++Builder竭nTray程序44,怎樣用代碼來(lái)最小化或恢更程序45,制作主窗口顯小前的版權(quán)窗U46,判斷是否已經(jīng)聯(lián)到internet47,獲取登陸用戶名48,隠藏桌面圖標(biāo)49、程序啟動(dòng)時(shí)運(yùn)行50、控制面板的調(diào)用51、模擬鍵盤(pán)按健52、讓標(biāo)題欄閃爍53、自動(dòng)屏幕保護(hù)54、年月日星期的取法55、鍵'事件56、隠藏任務(wù)欄57、號(hào)止關(guān)機(jī)58、怎樣以最小化方式啟動(dòng)程序59、在Memo中增加,行后,如何使竝后一行ftgM示60、設(shè)置壁紙方法1,怎樣在C++Builder中創(chuàng)建使用DLL自從C++Builder從去年浪漫情人節(jié)上市以來(lái)?吸川了大小的Delphi、VC.Vb的程序員到它的懷抱,火垃的C、C++程序員憊嘆道:總。有了C的可覩化開(kāi)發(fā)工具.對(duì)我也是祥?從BC、Delphi到C++Builder動(dòng)態(tài)鏈接庫(kù)(DLL)是Windows編程常遇到的編程方法,ド而我就介紹KrlBCB(C++Builderド簡(jiǎn)稱BCB)中如何創(chuàng)建使用DLし和叫技巧.ー、創(chuàng)建:使用BCBFile|NEW建立個(gè)新的DLLI租.并保存好文件BCB?生成?個(gè)DLし的程;ア樞柒“.DIIEntryPoint函數(shù)為個(gè)入口方法.如果使用書(shū)在DLL被系統(tǒng)初始化或若注銷時(shí)被調(diào)用.用來(lái)”入對(duì)DLL的初始化程序和卸載程序:參數(shù):hinst用來(lái)指小DLL的就地址;reason用來(lái)指小DLL的調(diào)用方式.用]區(qū)別多線程單線出對(duì)DLL的調(diào)用、創(chuàng)建、卸我DLL:.在程序中加入自己所要?jiǎng)?chuàng)建的DLL過(guò)程、函數(shù):.用dllimport描述出口;例程序如Rincludepragmahdrstopextern℃"_declspec(dllexport)inttest();intWINAPIDIIEntryPoint(HINSTANCEhinst,unsignedlongreason,void*){return1;}inttest()(return3;)注意:動(dòng)態(tài)鏈接庫(kù)中調(diào)用過(guò)程、隨數(shù)時(shí)有不同的CALLカ式—cded、_pascal,_fastcalk_stdcall.BCB中默認(rèn)的方式為_(kāi)cdecl(可不寫(xiě)),如果考慮兼容性可用時(shí)—stdcall聲明方法為:extern'C"_declspec(dllexport)int_stdcalltest();對(duì)『此中過(guò)程、函數(shù)也改為:int_stdcalltest()二、(4用DLL在BCB中使用DLL行兩種方法:.用辭態(tài)調(diào)用法首先需要住BCB的項(xiàng)目中加入輸入接口庫(kù)(importlibrary).打開(kāi)工程項(xiàng)目,使用BCBView|ProjectManager打開(kāi)項(xiàng)H列表,向項(xiàng)目中加入接口坤(?[ib)。其次在頭文件中加入接口聲明.例程序如K//defineinincludefileextern'C" dedspec(dllimport)int cdecltest();//usefunctioninmainprograminti:l=test();注意:(1)動(dòng)態(tài)縫接昨調(diào)用過(guò)程、函數(shù)時(shí)CALし方式可創(chuàng)建時(shí)方式ー樣不寫(xiě)為_(kāi)cded,其它需要聲明.⑵BCB創(chuàng)建的DLL行對(duì)應(yīng)的輸入接口圖(importlibrary)如只有DLし而無(wú)庫(kù)時(shí),可用BCB的in^lib?具產(chǎn)生implibxxx.libxxx.dlb另外可電tlibxxx.lib.xxx.lst產(chǎn)生DLL的內(nèi)部函數(shù)列表,許歩Windows的未公開(kāi)技術(shù)就是用這種方法發(fā)現(xiàn)的..動(dòng)態(tài)調(diào)用法動(dòng)態(tài)調(diào)用法吸用WindowsAPI屮的LoadLibrary。和GetProcAddress()未調(diào)入DLL庫(kù).指出庫(kù)中函數(shù)位置.這種方法較常見(jiàn).例程序如ド:HINSTANCEdd;int_stdcall(,ddd)(void);dd=LoadLibrary("xxx.dll");ddd=GetProcAddress(dd,"test");Caption=lnfFbStr(ddd());FreeLibrary(dd);三、注意:創(chuàng)建DLL時(shí)編譯鏈接時(shí)注意設(shè)置ProjectOptions.Packages標(biāo)笠:よ除Builderwithruntimepackages悔位格.Linker標(biāo)笠:去除UsedynamicRTL檢件框。合則創(chuàng)従的DLL需要RuntimepackagesorRuntimelibrary.2、用C++Builder在WIN.INI中保存信息現(xiàn)在許多軟件把程序中需要的數(shù)據(jù)保存在注冊(cè)表中,這樣カ用戶裝的軟件越來(lái)越多時(shí),致使注冊(cè)表越來(lái)越龐大,容易使系統(tǒng)出錯(cuò)。當(dāng)然,晶軟也建議在注冊(cè)我中保存數(shù)據(jù).但當(dāng)我們崙要保存的數(shù)據(jù)イ、多時(shí)完全可以把數(shù)據(jù)保存在WIN.INI中.這樣可以很方便地維護(hù).實(shí)現(xiàn)方法相對(duì)來(lái)說(shuō)比較簡(jiǎn)單,,下而我以BorlandC++Builder為例來(lái)說(shuō)說(shuō)如何實(shí)現(xiàn)。原理其實(shí)很簡(jiǎn)單,只需調(diào)用API的WriteProfileString和GetProfilelnt函數(shù)就可以ア.這兩個(gè)函數(shù)的原型足:BOOLWriteProfileString(LPCTSTRIpAppName.LPCTSTRIpKeyName.LPCTSTRIpString);UINTGetProfilelnt(LPCTSTRIpAppName.LPCTSTRIpKeyName.INTnDefault);其中IpAppName指4WINJNI中段的名字,即用。括起來(lái)的字符串.IpKeyName指在這個(gè)段中每?個(gè)項(xiàng)目的名字.IpString指這個(gè)項(xiàng)目的值,即?ゴ后的數(shù),nDefault為門(mén)GetProfilelnt沒(méi)有找到IpAppName和IpKeyName時(shí)返冋的值,即缺省值,而衣返冋為小爾做true或false).后者返冋為無(wú)符號(hào)整形值巧在WriteProfileString函數(shù)中IpKeyName為空(NULL)時(shí).則淸除這個(gè)段的全部?jī)?nèi)容,IpString為空時(shí).則清除這項(xiàng)目的內(nèi)容,即這行將済除抻.下面舉例子來(lái)說(shuō)明這兩個(gè)函數(shù)的用法.新建個(gè)應(yīng)用程序,在Forml上放兩個(gè)Edit和.個(gè)Button.、中Edit的Text為空,個(gè)Button的Caption分別為?漆加"、?實(shí)看-、?清除ユ雙サ添加.按鈕加入ド面代碼:WriteProfileString(“例子程序","項(xiàng)H".Editl-Text.c_str());雙擊“査看"按鈕加入如ド代碼:unsignedintTemp;Ten^=GetProfilelnt("例/程序”,??項(xiàng)目”,100);Edit2-*Text=lntToStr(Temp);雙キ"清除"按鈕加入如ド代碼:WriteProfileStringC1例-程序”,NULL.NULL):然后按F9鍵運(yùn)行程序.下來(lái)可以檢驗(yàn)?ド程序的正確性.在Editl中輸入數(shù)字.如“3265”.按“添加?按鈕.這時(shí)運(yùn)行、ysedit"來(lái)査看-WIN.IN「文件的最后麻可以看到加入了如下內(nèi)容:[例f程序]項(xiàng)目N3265其中“0”和“ビ是函數(shù)門(mén)動(dòng)加上的。按ド“化看"按鈕,在Edit2中出現(xiàn).3265。ッ按卜”消除“按鈕可淸除添加的部分。經(jīng)過(guò)れ呑可知程序已達(dá)到預(yù)期的f!的.并愛(ài)編程的朋友可以把上述方法應(yīng)用到自己的程序中去.來(lái)達(dá)到保存數(shù)據(jù)信息的作用.當(dāng)確實(shí)要把信息保存到注冊(cè)表中,可以在C++Builder中定義個(gè)TRegistry類的對(duì)象來(lái)進(jìn)行相關(guān)的操作,或音H接調(diào)用Windows的API函數(shù),R體如何編程大家可以參閱稲關(guān)資料或西同我聯(lián)系.3、如何在C++Builder中檢測(cè)硬件在:我們編寫(xiě)的程序中常常要和硬件打交道,那么如何在程序中確定系統(tǒng)中是否有該設(shè)備,它的運(yùn)行狀態(tài)乂是怎樣的呢?對(duì)于初學(xué)者來(lái)說(shuō),這個(gè)問(wèn)題常常不好解決,其實(shí)只褥簡(jiǎn)單地利用幾個(gè)API困教,硬件的問(wèn)題并不神秘“下面就讓我們起看看在C++Builder中是如何ね測(cè)硬件的.檢測(cè)CPU的P號(hào)先讓我們從最簡(jiǎn)單的做起,舌呑自己的CPU型號(hào)?首先,在C++Builder'I'lHlBffl1所小的窗體,在下面的幾個(gè)例チ中我們將直便用這個(gè)窗體作小范,它包括個(gè)用來(lái)激活測(cè)試的Button和個(gè)用來(lái)顯示結(jié)果的Memo:我們可以用GetSystemlnfo這個(gè)AP!獲得CPU的中號(hào).將ド列代碼添加到Button的Click事件里就可以了:void_fastcallTForm1::Button1Click(TObject*Sender)(〃獲得CPU型號(hào)SYSTEM_INFOsysteminfo;GetSystemlnfo(&systeminfo);Memo1->Lines->Add("您的CPU類型)A「+String(systeminfo.dwProcessorType));)運(yùn)行它,點(diǎn)擊Test試試,CPU型號(hào)出來(lái)了吧!.檢渕內(nèi)存狀態(tài)柒得內(nèi)存狀態(tài)的方法和CPU型號(hào)差不多,只是他用到的是另外個(gè)API:GlobalMemoryStatus"中,成員dwTotalPhys用來(lái)獲得物理內(nèi)存總イ,而dwAvailPhys顧名思義是有效物理內(nèi)存的意思。我們只要把F面幾行代碼加到上面程序的后面就可以了(不用重做?F同):〃獲存內(nèi)存狀態(tài)MEMORYSTATUSmemory;memory.dwLength=sizeof(memory);〃初始化memory.dwLength=sizeof(memory):〃初始化GlobalMemoryStatus(&memory);Memo1->Lines->Add("您的物理內(nèi)存是(Mb):?+String(int(memory.dwTotalPhys/1024/1024)));Memo1->Lines->Add(-11中可用內(nèi)存是(Kb):"+String(int(memory./1024)));怎么樣.呑出點(diǎn)門(mén)道了么?兩段程序的格式幾乎模樣,其實(shí),GetSystemlnfo和GlobalMemoryStatus還可以獲得許多其他仃關(guān)CPU和內(nèi)存的信息.就按照上面的格式去套就行了,更詳細(xì)的資料可以去呑C++Builder4的Help..檢測(cè)可用硬盤(pán)空間好了,經(jīng)過(guò)前而兩個(gè)簡(jiǎn)單問(wèn)題的熱身,我們來(lái)處理一個(gè)稍微雙雜的問(wèn)題:我們知道安裝程序大都冇個(gè)冷測(cè)硬盤(pán)空間的過(guò)程,那么這是怎么實(shí)現(xiàn)的呢?他用到的是API兩數(shù)GetDiskFreeSpace.這個(gè)函數(shù)輸入個(gè)參數(shù):目標(biāo)盤(pán)的路徑:返冋四個(gè)參數(shù).依次是斑簇的扇M數(shù)、每扇區(qū)的字節(jié)數(shù)、空閑的簇?cái)?shù)、總簇?cái)?shù)。假如我們需要檢測(cè)C盤(pán)的總存址和可用容量.那么可以把以ド代碼加到上面的程序中:〃獲得C盤(pán)可用空間DWORDsector.byte,duster,free;longintfreespace.totalspace;

freespace=int(free)*int(byte)*intGetDiskFreeSpace(-C:,§or.&byte,&free,&cluster);〃獲得返冋參數(shù)freespace=int(free)*int(byte)*inttotalspace=int(duster)*int(byte)*int(sector)/1024/1024;//i|(sectoral024/1024;”計(jì)算可用空間Memo1->Lines->Add("C財(cái)總空間(Mb):"+String(totalspace));Memo1->Lines->Add("C做可用空間(Mb)「+String(freespace));怎么樣?現(xiàn)在可以自己做安裝程序了吧!.檢測(cè)CD-ROM我們?cè)诰帉?xiě)程序時(shí)常常需要讀取CD-ROM可是究竟哪個(gè)盤(pán)符是光驅(qū)呢?有人是板練謝?是光驅(qū)呢?有人??將最后個(gè)就符當(dāng)作光驅(qū)的,但是當(dāng)遇到雙あ騏或齊MO的情況時(shí)常常會(huì)出錯(cuò),其實(shí)這個(gè)問(wèn)題用?個(gè)API來(lái)解決并不困難,這就是:GetDriveTypef),這個(gè)函數(shù)返回?個(gè)0-6之間的值?依次代表:0-未知盤(pán)、1ー不存在、2一可移動(dòng)磁盤(pán)、3ー固定磁盤(pán)、4ー網(wǎng)絡(luò)磁做、5-CD-ROM.6ー內(nèi)存虛擬盤(pán).因此我們可以車加下而代碼來(lái)マ找8-ROM:II獲得CD-ROM信息UINTtype;charname;for(name=C;name<='Z';name++)〃循環(huán)ね測(cè)A-Z{type=GetDriveType((String(name)+String(':')).c_str());〃獲得磁盤(pán)類やif(type==5)Memol->Lines->Add("您的光分盤(pán)符為:"+String(name));}得到光鄲盤(pán)符之后我們可以進(jìn)ゆ利用API函數(shù)GetVolumelnformation檢測(cè)光物:中是否有光盤(pán),這個(gè)函數(shù)如果成功調(diào)用,會(huì)得到磁盤(pán)的卷標(biāo)序列號(hào)等信息:如果調(diào)用失敗則可知光驊中無(wú)光盤(pán).程序如下:〃檢測(cè)光盤(pán)(假設(shè)光驅(qū)為G:)charvolname[255],filename[100];//buffer[512];DWORDsno.maxl,fileflag;if(!(GetVolumelnformation("G:M,volname,255,&sno,&maxl,&fileflag.filename,100)))〃如果返回值為假M(fèi)emol->Lines->Add("G驅(qū)中沒(méi)有發(fā)現(xiàn)光盤(pán)");else〃如果返回值為真{Memol->Lines->Add("G》中光盤(pán)卷標(biāo)為:"+String(volname));Memol->Lines->Add("G歩中光盤(pán)序號(hào)為:"+String(sno));).檢測(cè)聲ド配黃在編制多媒體程存時(shí),我們常常會(huì)用到聲音文件,而當(dāng)這些程序在沒(méi)有配宜円卡的機(jī)器上運(yùn)行時(shí),我們應(yīng)該給出必要的警告.對(duì)F聲K的校測(cè),可以分別通過(guò)waveOutGetNumDevs()和midiOutGetNumDevs。松測(cè)波形設(shè)芻?和MID!設(shè)備.再利用waveOutGetDevCaps()和midiOutGetDevCaps()茯得聲各設(shè)芻的細(xì)節(jié)資料“將下面?段代碼加入上面的軽序即可,但要注意將#include添至程序首都:〃檢測(cè)聲卡intwavedevice,mididevice;WAVEOUTCAPSwavecap;MIDIOUTCAPSmidicap;wavedevice=(int)waveOutGetNumDevs():〃波形設(shè)備信息mididevice=(int)midiOutGetNumDevs();IIMIDI設(shè)備信總mididevice=(int)midiOutGetNumDevs();//MID!設(shè)瞽倍思if(wavedevice==0)Memol->Lines->Add「沒(méi)有發(fā)現(xiàn)波形設(shè)品");else{waveOutGetDevCaps(0,&wavecap,sizeof(WAVEOUTCAPS)):Memo1->Lines->Addf當(dāng)曲波形設(shè)備:rStringlwavecap.szPname));if(mididevice==O)Memo1->Lines->Add「沒(méi)仃發(fā)現(xiàn)MID!設(shè)備つ;else{midiOutGetDevCaps(0,&midicap,sizeof(MIDIOUTCAPS));Memo19->Lines->Add("當(dāng)前MIDI^:"+String(midicap.szPname));).檢測(cè)M示器信息編り和圖形圖像行關(guān)的程序時(shí)常常需要檢測(cè)顯示戕的分辨率和色深,地后我們來(lái)看看這個(gè)問(wèn)題的解決辦法。分辨率的求法很簡(jiǎn)單.直接調(diào)用Screen對(duì)象的用性就行了?而要求色深則嬰利用API函數(shù)GetDeviceCaps獲得毎像素的比特?cái)?shù)和色彩的頁(yè)而數(shù),然后計(jì)兌2的.年像素的比特?cái)?shù).次軸即得色彩的悌度數(shù),再計(jì)算?色彩的梯度數(shù)?的“色彩的員曲數(shù)?次籍即得色深,程序如ド:〃檢測(cè)M歩器inttcs;longintbpp.cp.tc;Memol->Lines->Add(""i而分辨率X;:'+String(Screen->Width)+"*"+String(Screen->Height));bpp=GetDeviceCaps(Form1->Canvas->Handle.BITSPIXEL);bpp=GetDeviceCaps(Form1->Canvas->Handle.BITSPIXEL);tcs=pow(2,bpp);〃計(jì)算色彩的梯度數(shù)cp=GetDeviceCaps(Form1->Canvas->Handle,PLANES);tc=pow(tcs,cp);〃計(jì)碎色深Memo1->Lines->Add(""1i|i/色深為:"+String(tc));好了,現(xiàn)在在讓我們點(diǎn)擊ートTest吧.就實(shí)本文所涉及的API函數(shù)的功能不止這些.大家F去可以査査Win32APIF冊(cè)?或在!!接在C++Builder4中察看Help相信自己開(kāi)發(fā)個(gè)硬件檢測(cè)軟件也不是難事哦!4、C++Builder如何嘀應(yīng)消息及自定義消息Inprise(Borland)C++Builder'P.可以鉄在Delphi中樣響應(yīng)消息.只是看起來(lái)耍稍復(fù)雜點(diǎn).對(duì)于系統(tǒng)已定義的消息.可以直接響應(yīng):#defineWM_MY_OPEN_CMDLINE_FILE(WM_USER+1)〃進(jìn)程間通訊的白定義消息"defineWM_MY_SEARCH_NODE(WM_USER+2)〃介找命令的!'I定義消息classTSomeForm:publicTForm("…類中的其它代碼protected:〃消息的響應(yīng)過(guò)程void_fastcallOpenCmdLineFile(TMessageMessage);void_fastcallSearchDocumentNode(TMessageMessage);void_fastcallGetWindowMinMaxlnfo(TWMGetMinMaxlnfoMessage);〃以下通過(guò)宏定義實(shí)現(xiàn)消息的正確響應(yīng)BEGIN_MESSAGE_MAPMESSAGE_HANDLER(WM_MY_OPEN_CMDLINE_FILE.TMessage.OpenCmdLineFile)MESSAGE_HANDLER(WM_MY_SEARCH_NODE.TMessage,SearchDocumentNode)MESSAGE_HANDLER(WM_GETMINMAXINFO.TWMGetMinMaxInfo,GetWindowMinMaxInfo)END_MESSAGE_MAP(TForm));//enddass〃以下為實(shí)現(xiàn)代碼void_fastcallTSomeForm::OpenCmdLineFile(TMessageMessage){〃宜接通過(guò)消息結(jié)構(gòu)傳遞參數(shù)LPSTRlpCmdLine=(LPSTR)Message.LParam;〃從Message中取得參數(shù)this*>HandleCmdLineFile(lpCmdLine);"處理命令行的參數(shù)return;}void fastcallTSomeForm::SearchDocumentNode(TMessageMessage){〃響應(yīng)査找消息//Message中的參數(shù)在此處不需要。this->SearchNode();return;}void fastcallTSomeForm::GetWindowMinMaxlnfo(TWMGetMinMaxlnfoMessage){〃設(shè)置主窗口的最小尺寸MINMAXINFO*MinMaxlnfo=Message.MinMaxlnfo;MinMaxlnfo->ptMinTrackSize.x=400;MinMaxlnfo->ptMinTrackSize.y=300;return;)其中:TMessage和!WMGetMinMaxInfo類型的定義可參見(jiàn):C:\ProgramFiles\Bor1and\CBuilder\inlucde\vcl\Messages.hpp:北它的消息響應(yīng)方法與此相同.另外,可以為自定義的消息也定義個(gè)對(duì)庖的消息結(jié)構(gòu)(如:TSearchNode_Message),至于如何定義消息結(jié)構(gòu).可以參考:C:\ProgramFiles\Borland\CBuilder\inlucde\vcl\Messages.hpp5、利用C++Builder開(kāi)發(fā)動(dòng)?DLL我們?cè)赪indows98環(huán)境ド執(zhí)行拷貝文件、査找文件或計(jì)算機(jī)等耗時(shí)比較長(zhǎng)的操作時(shí),Windows會(huì)顯示ー個(gè)小小的動(dòng)畫(huà),指ポ正在進(jìn)行的操作,リ死板的辭止圖像相比増色不少.那么我們自己開(kāi)發(fā)軟件時(shí),能否也顯示ー個(gè)這樣的動(dòng)畫(huà)提示呢?我在開(kāi)發(fā)個(gè)外貿(mào)應(yīng)用軟件系統(tǒng)時(shí)?遇到的數(shù)據(jù)量很大,當(dāng)通過(guò)史合條件査找時(shí),因?yàn)椴皇菙?shù)據(jù)庫(kù)表的每個(gè)項(xiàng)目都仃索引,所以很費(fèi)時(shí),系統(tǒng)也會(huì)表現(xiàn)出長(zhǎng)時(shí)間停頓,用戶礴覺(jué)極為不爽。我經(jīng)過(guò)一段時(shí)間的探索,開(kāi)發(fā)了一個(gè)能夠在來(lái)川的開(kāi)發(fā)環(huán)埴PowerBuilderド調(diào)用的動(dòng)位DLL,由f釆用多線程編程,PB調(diào)用的DLL函數(shù)能夠及時(shí)將控制權(quán)交還為PB,不影響應(yīng)用系統(tǒng)的運(yùn)轉(zhuǎn).用戶能夠看到ー個(gè)東西住動(dòng),也就不會(huì)想到系統(tǒng)是不是停止響應(yīng)了,感覺(jué)時(shí)冋也似乎沒(méi)那么久了?代碼り編譯選項(xiàng)⑴.在C++Builder的File案單卜選杼N(yùn)ew?企NewItem時(shí)話框的New屈性中選擇DLL.C++Builder就會(huì)創(chuàng)建個(gè)空白的DLL項(xiàng)目,(2).6.File柬單ド選擇NewForm,C++Builder創(chuàng)建個(gè)空白的Form,修改它的屬性為BorderStyle=bsDialogBordericons的子屬性均為FalseFormStyle=fsStayOnTopPositionspoScreenCenterName=StatusForm⑶.在Form上添加一個(gè)Win32ド的Animate控¢1Animatel,修改它的屬性為Align=aHbp(4).6:FormI跡加?個(gè)Standardド的Button控件Button_Cancel,再添加System卜.的Timer控件Timeri.設(shè)置定時(shí)Interval時(shí)間位250.以較快的響應(yīng)用戶的取消請(qǐng)求.因?yàn)镻B應(yīng)用系統(tǒng)。動(dòng)畫(huà)窗體代碼分別屬F兩個(gè)戰(zhàn)程,不能釆用PB線程H接關(guān)閉動(dòng)畫(huà)窗體紋程的窗口,否則會(huì)引起系統(tǒng)運(yùn)行不正常,因此釆用PB線程設(shè)置關(guān)閉標(biāo)志,血?jiǎng)忧€程采用Timer控件定時(shí)檢査標(biāo)志. 我檢測(cè)到關(guān)閉標(biāo)志,就關(guān)閉隕U,清除線程標(biāo)志,結(jié)束動(dòng)畫(huà)線程。下血給岀編碼及編碼原理:1.DLLDLL1:體代碼:DLLI:體代碼‘定義DLL公用変獨(dú)g_CommonAVI対Animate控件動(dòng)畫(huà)類型索引gi_CanceledButton_Cance!按鈕是令被選擇過(guò)gi_AVIType要騒示的動(dòng)畫(huà)類型.由DLL輸出函數(shù)做為參數(shù)輸入gi_RequestClose求動(dòng)畫(huà)線P二關(guān)閉標(biāo)志'gi_WindowActive動(dòng)畫(huà)窗口所處的狀態(tài)IpsWinTitle動(dòng)畫(huà)窗體的標(biāo)題,由DLL輸岀函數(shù)做為參數(shù)輸入/TCommonAVIg_CommonAVIQ={aviNone,aviFindFolder,aviFindFile.aviFindComputer,aviCopyFiles,aviCopyFile,aviRecycleFile,aviEmptyRecycle,aviDeleteFile};intgi_Canceled=0,gi_AVIType=0;intgi_RequestClose=0,gi_WindowActive=0;charlpsWinTitle[256];HWNDhWndParent=NULL;r定義dll輸出函教ッextern"C"_declspec(dllexport)intpascalDIIEntryPoint(HINSTANCEhinst,unsignedlongreason,void*);extern"C"_declspec(dllexport)intpascalShowStatusWindow(intWIType,LPSTRWinTitle.longhWnd);extern'C"_declspec(dllexport)intpascalGetStatus(intai_CloseWin);extern"C"_declspec(dllexport)intpascalCloseStatusWindow();廠定義線程TformThread:*/classTFormThread:publicTThread{public://Userdedarabons_fastcallTFormThread(boolCreateSuspended);void fastcallExecute(void);};fastcallTFormThread::TFormThread(boolCreateSuspended):TThread(CreateSuspendedX}r動(dòng)畫(huà)線程執(zhí)行代碼,動(dòng)畫(huà)窗體的定時(shí)器控件會(huì)關(guān)閉它,消除窗體存在標(biāo)忐后結(jié)束線程的運(yùn)行7void_fastcallTFormThread::ExecutefvoidXgi_WindowActive=1;StatusForm=newTStatusForm(NULL);StatusForm->Capbon=lpsWinTitle;StatusForm->ShowModal();gi_WindowActive=0;deleteStatusForm;gi_RequestClose=0;}〃定義個(gè)線程實(shí)例指針ッTFormThread"FormThread;,輸出函數(shù)代碼實(shí)現(xiàn)部分,DIIEntryPoint32位DLL入口'ShowStatusWindowM小動(dòng)網(wǎng)窗口,它通過(guò)創(chuàng)建?個(gè)線程來(lái)創(chuàng)建窗口,避免由于窗口的MODAL屬件而使控制權(quán)イ、能及時(shí)的返還給調(diào)用者?GetStatus取得“取消?狀態(tài).即用戶有沒(méi)有選擇"取消?按鈕,CloseStatusWindow關(guān)閉動(dòng)畫(huà)甯ロ,7_declspec(dllexport)intWINAPIDIIEntryPoint(HINSTANCEhinst.unsignedlongreason,void*)return1;_dedspec(dllexport)intpascalShowStatusWindow(intAVIType.LPSTRWinTitle.longhWndRhWndParent=(HWND)hWnd;memset(lpsWinTitle,0,sizeof(lpsWinTitle)):stmcpy(lpsWin'ntie,WinTitle,sizeof(lpsWinTitle)-1);if(AVIType>0&&AVIType<=8)gi_/WIType=AVIType;FormThread=newTFormThread(true);FormThread->Priority-tpNormal;FormThread->Resume();)dedspec(dllexport)intpascalGetStatus(intai_CloseWin){if(gi_Canceled)if(gi_WindowActiveXgi_RequestClose=1;while(gi_RequestClose);)returngi_Canceled;_dedspec(dllexport)intpascalCloseStatusWindow(Xif(gi_WindowActiveXgi_RequestClose=1;while(gi_RequestClose);)returngi_Canceled;}2.窗體StatusForm的代碼:TStatusForm*StatusForm;externintgi_Canceled;externintgi_AVIType;externTCommon/WIg_CommonAVI[J;_fastcallTStatusForm::TStatusForm(HWNDParentwindow):TFomXParentWindow)(gi_Canceled=O;〃取消按鈕并不宜接美閉窗體.而指示設(shè)置収濟(jì)標(biāo)志,供調(diào)用者査看void fastcallTStatusForm::Button_CancelClick(TObject*Sender)(gi_Canceled=1;IIModalResult^mrCancel;}H I!激活動(dòng)畫(huà),flFORMCREATE事件中void fastcallTSlatusForm::FormCreate(TObject'Sender)(Animatel->CommonAVI=g_CommonAVI[gi_WIType];Animatel->Active-true;}// externintgi_RequestClose;I!定時(shí)圈出件校測(cè)到結(jié)束標(biāo)志關(guān)閉窗體void fastcallTStatusForm::TimeriTimer(TObject,Sender){if(gi_RequestClos?XModalResult=mrOk;}}(5)設(shè)置編譯選項(xiàng):Project->Options扌J?開(kāi)ProjectOptions對(duì)話框,消除Linker屬性り]中的UseDynamicRTL標(biāo)上,淄除Packages屬性頁(yè)中的Buildwithruntimepackages這樣只耍單個(gè)DLL就可以運(yùn)行了,而不必安裝些動(dòng)態(tài)連接運(yùn)行時(shí)間庫(kù)“使用動(dòng)附DLL上面編譯出DLL可以由其它任何開(kāi)發(fā)語(yǔ)二調(diào)用.下面給出在PB中的使用方法?(1)定義://Declare->GlobalExternalFunctionsFUNCTIONLongShowStatusWindow(LongAVIType.StringWinTltle.longhWnd)&LIBRARY'STATWIN.DLL"ALIASFOR"ShowStatusWindow"FUNCTIONLongGetCancelStatusfLongCloseWindow)&LIBRARY'STATWIN.DLL"ALIASFOR"GetStatus"FUNCTIONLongCloseStatusWindow()&LIBRARY-STATWIN.DLL-ALIASFOR"CloseStatusWindow"(2)調(diào)用:longH_EndTime〃顯示査找文件夾動(dòng)畫(huà)ShowStatusWindow(2)setpointer(HourGlass!)H_EndTime=Cpu()+10*1000DOifGetCancelStatus(0)=1thenexitendif//做想做的事情L(zhǎng)OOPUNTILcpu()$#@62.ll_EndTimeCloseStatusWindow()6,用C++Builder3制作屏ア保護(hù)程序屏幕保護(hù)程序是以scr為擴(kuò)展名的標(biāo)準(zhǔn)Windows可執(zhí)行程序,在激活控制面板的顯示器屬性的“屏晶保護(hù)程序項(xiàng)時(shí),該模塊會(huì)白動(dòng)在Windows啟動(dòng)H錄?Windows"衆(zhòng)和系統(tǒng)H錄)ド/找擴(kuò)展名是scr的基[Windows的可執(zhí)行文件。使用赤扉保護(hù)程序,不僅い以筵氏顯加曙的使用壽命,還可以保護(hù)私人信息。編制屏暮保護(hù)程序不僅要涉及消息的處理,還嬰涉及命令行參數(shù)的處理.在WIN32SDK支檔屮描述了編制甚」WIN32的標(biāo)準(zhǔn)的屏幕保護(hù)程序所必須遵守的嚴(yán)格標(biāo)準(zhǔn)。按照這此標(biāo)準(zhǔn),屏幕保護(hù)程序必須要輸出兩個(gè)函數(shù):ScreenSaverProcfllScreenSaverConfigureDialog,但是,4Windows系統(tǒng)中的很多屏幕保護(hù)程序并沒(méi)”遵循這些標(biāo)準(zhǔn)(使用Impdef或者tdump,突用匚貝倉(cāng)存即可).并且使用該文檔中介紹的方法編罵屏幕保護(hù)程序,不僅要使用資源編輯器,并且在鏈接時(shí)還要利用Scrsaver.lib文件(在C++Builder3環(huán)境ド?不能成功連接》?不僅要涉及消息的處理,還要涉及命令行參數(shù)的處理.C++Builder3是種快速的應(yīng)用程序開(kāi)發(fā)I具,提供了許多類型的應(yīng)用程序開(kāi)發(fā)模板,但沒(méi)冇揭供開(kāi)發(fā)屏幕保護(hù)程序的模板,并且在其在線幫助中也沒(méi)。提及如何開(kāi)發(fā)這類應(yīng)用程序。經(jīng)過(guò)本人的研究,找到了用C++Builder3編制屏扉保護(hù)程序的方法,在控制面板的"顯示器國(guó)性.項(xiàng)的.屏幕保護(hù)程序”頁(yè)中進(jìn)行設(shè)置時(shí),霍遇到?.種類型的命令行參數(shù)并且各種情況下的屏幕保護(hù)程序的顯示結(jié)果也各不相同,一般來(lái)講?就需要二種類型的帝體(或兩種,在隨后的內(nèi)容中討論)。ド面將分四步來(lái)具體地說(shuō)明如何編制屏幕保護(hù)程序。ー、屏幕保護(hù)程序的選擇如果在標(biāo)題為"屏幕保護(hù)程序-的卜ー拉列表框中選中了某個(gè)保護(hù)程序時(shí),系統(tǒng)會(huì)自動(dòng)扃動(dòng)該程序,這個(gè)程序的顯示范]目是在這個(gè)頁(yè)面上的顯示器圖形的屏幕能囘同時(shí),會(huì)將兩個(gè)命令行參數(shù):?個(gè)是”ぜ另個(gè)圧顯小窗I」的句柄ル遞給這個(gè)被選中的程序因此這類程序首先應(yīng)該能然處理命令行參瓢在C++Builder3中,。命令行參數(shù)處理有關(guān)的函數(shù)是:ParamCount。和ParamSt"),具體的申明方式如ド:extemPACKAGEint_fastcallParamCount(void);該函數(shù)返冋命令行參數(shù)的個(gè)數(shù),但不包含應(yīng)用程序本身。extemPACKAGEAnsiString_fastcallParamStr(intlndex);該函數(shù)返冋指定索弓I值的命令行參數(shù)。ParamStr(O)返回的是應(yīng)用程序本身。所以,在這以步驟中的參數(shù)判斷的語(yǔ)句如ド:if(UpperCase(ParamStr(1))==""p"||UpperCase(ParamStr(i)>==7p")(//addthecodeinhere)在完成了參數(shù)判斷后,就應(yīng)核對(duì)顯示窗口的處理,為能夠使程序在品示器圖形的屏暮區(qū)域內(nèi)嫌示,就要瑕新設(shè)置程序的父オ口和顯示區(qū)域。這要涉及到父窗口句柄的獲得及父窗口的設(shè)置,以及API函數(shù)的調(diào)用.這種環(huán)境ト的父窗II句柄就是傳遞過(guò)來(lái)的第?個(gè)命令行參數(shù):要設(shè)置父窗口,只得設(shè)實(shí)窗體的Parentwindow爪性即可.這段程序如ド:RECTrc;//Line1HWNDhWnd=(HWND)(atol(ParamStr(2).c_str()))y/Line2::GetClientRect(hWnd.&rc);//Une3ParentWindow=hWndy/Line4Left=rc.lefty/Line57bp=rc.top;//Ljne6Wkjth=rcright-rc.left;//Line7Height=rc.botton>rc.top;//Une8在上面的程序片段中,第2行語(yǔ)句是將性遞過(guò)來(lái)的第2個(gè)參數(shù)轉(zhuǎn)換成窗U句柄:然后,第3行語(yǔ)句利用這個(gè)窗口句柄,調(diào)用API函數(shù)以獲得該窗L1的客戶區(qū)域:第4行語(yǔ)句將選中的屏森保護(hù)程序的父窗口設(shè)置為指定的窗口;余卜一的語(yǔ)句是將該程序的窗口大小設(shè)置成副窗I」的客戶區(qū)大小。這程序片段的位置應(yīng)該是在窗體的OnCreate事件處理中.需要說(shuō)明的是,這種類型(包括第三步介紹的窗體)的窗體樣式應(yīng)是:FormStyle=fsStayOnTop;窗體邊界的樣式應(yīng)為:BorderStyle=bsNone;當(dāng)然,這時(shí)也不需要取標(biāo)圖形,因此,可以將鼠標(biāo)的形狀設(shè)為crNone:Cursor=crNone;二、初始化參數(shù)的設(shè)買(mǎi)單擊?馳示器屬性.模塊的“屏毎保護(hù)程序.版而中的"設(shè)置"按鈕時(shí),系統(tǒng)會(huì)盾動(dòng)指定的保護(hù)程序的初始值設(shè)簣對(duì)話框.這時(shí)他遞過(guò)來(lái)的命令行參數(shù)圧:?/c?或--C"(參數(shù)的處理ワ前面介紹的相同)?通過(guò)該對(duì)話框,可以設(shè)置保護(hù)程序的ー些初始參數(shù).比如圖形的變化快慢等。在這段程序中.還要涉及到初始化文件或注冊(cè)表的讀寫(xiě),用以記或初始化參數(shù).使「?保護(hù)程序后動(dòng)時(shí)使用.三、預(yù)覽及運(yùn)行預(yù)駐的效果就是屏幕保護(hù)程序被激活后的整示?單擊單擊"亞示等尿性”模塊的“屏幕保護(hù)程序.頁(yè)面中的”預(yù)覽?按鈕,就可以觀察保護(hù)程序運(yùn)行的實(shí)際效果.這時(shí).系統(tǒng)啟動(dòng)該程序時(shí)傳遞過(guò)來(lái)的命令行參數(shù)是:7s"uJi"-s\對(duì)「命令行參數(shù)的處理ワ前面的步驟相同.但れ這一歩中,汪要對(duì)幾個(gè)消息進(jìn)行處理.這些消息是:WM_MOUSEMOVE.WM_LBUTTONDOWN.WM_MBUTTONDOWN.WM_RBUTTONDOWN.WM_KEYDOWN.WM_ACTIVATE?對(duì)WM_MOUSEMOVE和WM_ACTIVATE消息的處理形式如下:void_fastcallHandleSomeMessage(TMessage&Msg)(switch(Msg.Msg)caseWM_ACTIVAIE:if(Msg.WParamLo==WA_INACTIVE)Close();break;caseWM_MOUSEMOVE:if(OldMouseX==-1&&OldMouseY=-1)//Intheconstructor.OldMouseXandOldMouseYmustbeinitializedby-1.{OldMouseX=Msg.LParamLo;OldMouseY=Msg.LParamHi;}elseif(OldMouseX!=Msg.LParamLo||OldMouse!=Msg.LParamHi)Close();break;対丁小他的消息僅僅是調(diào)用Close。函數(shù)來(lái)關(guān)閉應(yīng)用程序即可.應(yīng)用這種消息處理方式時(shí),必須要類定義時(shí)進(jìn)行消息映射,不然的話?就要在相應(yīng)的消息響應(yīng)中進(jìn)行處理(使用一定的布爾變錄,就可以與第?步合用ー個(gè)窗體)?與第步類似,在該步驟中,也不需要具體的鼠標(biāo)指針的形狀,因此,將鼠標(biāo)指計(jì)設(shè)為crNone:Cursor=crNone;四、修改項(xiàng)目源文件在C++Builder3中, 個(gè)窗體也就是?個(gè)類.換句話說(shuō).具宥某些特性的類也就是個(gè)窗體,因此.編制屏總保護(hù)程序時(shí),也不需要什么主窗體.同時(shí).也不用自動(dòng)創(chuàng)建某些宙體了.這時(shí)就要修皮項(xiàng)目源文件.ド面所列出的程序就是筆者在編制某屏幕保護(hù)程序時(shí)使用的項(xiàng)H源文件.供讀者參考。WINAPIWinMain(HINSTANCE.HINS7ANCE.LPSTR,int)(CreateMutex(NULL,true,"Screensaver");if(GetLastError()!=ERROR_ALREADY_EXISTS)Application->lnitialize();Application->Titie="W版保護(hù)程序測(cè)試”;if(UpperCase(ParamStr(1))-=7C"||UpperCase(ParamStr(1))=="-C"||ParamCount()==0){TScrSaverConfiguerF*ScrCfg=newTScrSaverConfiguerF(NULL);ScrCfg->ShowModal();deleteScrCfg;retumO;W単ホ?設(shè)置-按鈕elseif(UpperCase(ParamStr(1))=="/P"||UpperCase(ParamStr(1))=="-P"){TScrForP*ScrFP=newTScrForP(NULL);ScrFP->ShowModal();deleteScrFP;returnO;W在“屛常保護(hù)程序?下拉列衣框中選擇個(gè)程序elseif(UpperCase(ParamStr(1))=s7S"||UpperCase(ParamStr(1))=="-S"){TScreenSaveF*ScreenSave=newTScreenSaveF(NULL);ScreenSave->ShowModal();deleteScreenSave;retumO;W單擊?隨覽"按鈕,及運(yùn)行屏幕保護(hù)程序elseretuml:)catch(Exception&exception)(Application->ShowException(&exception);}}retumO;}//theWinMainFunctionend前面介紹了在C++Builder3F編制押解保護(hù)程序的方法.對(duì)于C++Builder3這神RAD工具來(lái)講,開(kāi)發(fā)這類程序也是相當(dāng)方便的,按照前述的方法,可以存極短的時(shí)間開(kāi)發(fā)出屏幕保護(hù)程序.對(duì)丁?屏幕保護(hù)程序.在本文中沒(méi)有說(shuō)明的就是如何設(shè)置口令的問(wèn)題,這部分就由讀者自己摸索吧.7、TCP/IP頭格式ー、先是常用的IP頭格式?IP頭格式:版本號(hào)(4位)IP頭長(zhǎng)度(4位)服務(wù)類型(8位)數(shù)據(jù)包長(zhǎng)度(16位)標(biāo)識(shí)段(16位)標(biāo)志段(16位)生存時(shí)間(8位)傳輸協(xié)議(8位)頭校驗(yàn)和(16位)發(fā)送地址(16位)目標(biāo)地址(16位)選項(xiàng)壊充簡(jiǎn)單說(shuō)明1.IP頭長(zhǎng)度計(jì)算所用単位カ32位字.常用來(lái)計(jì)算數(shù)據(jù)開(kāi)始偏移ホ2,數(shù)據(jù)包長(zhǎng)度用字節(jié)我示,包括頭的長(zhǎng)度,因此最大長(zhǎng)度為65535字.生存時(shí)間表示數(shù)據(jù)被丟失前保存在網(wǎng)絡(luò)上的時(shí)間,以秒計(jì),.買(mǎi)校驗(yàn)和的算法為取所有16位3的16位和的補(bǔ)碼..選項(xiàng)長(zhǎng)度是可變的,壊充區(qū)域隨選項(xiàng)長(zhǎng)度變化,用廠?確保長(zhǎng)度為修字時(shí)的倍數(shù).structiphdr{BYTEversionihl;BYTEtos;WORDtotjen;WORDid;WORDfrag_off;BYTEttl;BYTEprotocol;WORDcheck;DWORDsaddr;DWORDdaddr;I*Putoptionshere.7};二、TCP頭格式TCP頭格式:源端口(16位)目的端口(16位)序號(hào)(32位)確認(rèn)號(hào)(32位)數(shù)據(jù)偏移(4位)保留(6位)標(biāo)志(6位)窗口(16位)校驗(yàn)和(16位)緊急指針(16位)選項(xiàng)珀充簡(jiǎn)單說(shuō)明.數(shù)據(jù)偏移用于標(biāo)識(shí)數(shù)據(jù)段的開(kāi)始.保留段6位必須為〇.標(biāo)志包括緊急標(biāo)志、確認(rèn)標(biāo)志、入校標(biāo)志、重置標(biāo)志、同步標(biāo)志等。.校驗(yàn)和計(jì)算方式為將頭與16位進(jìn)制反碼和中的16(寸進(jìn)制反碼加在ー起..選項(xiàng)長(zhǎng)度是可變的,填充M域隨選項(xiàng)長(zhǎng)度變化,用「確保長(zhǎng)度為性字節(jié)的倍數(shù)..更詳細(xì)的說(shuō)明請(qǐng)參閱仃關(guān)資料.structtcphdr{WORDSourPort;WORDDestPort;DWORDSeqNo;DWORDAckNo;BYTEHLen;BYTEFlag;WORDWindow;WORDChkSum;WORDUrgPtr;t*Putoptionshere.7};8、UDPー、說(shuō)明使用UDP時(shí),直接使用AP!代背控件。第個(gè)科リ汽ReadBufferUdp)使用來(lái)接收到緩存中."Destino”變量ガ常用要,如果你從其他地方接收數(shù)據(jù)到Buffer,你必須設(shè)ナDestino=0并且在以后執(zhí)行的時(shí)候賦值你將要發(fā)送的包的地址給它(aftertheexecutionitwillhavetheaddresswhichsendyouthepacket.如果你只想從ー個(gè)指定的地址接收數(shù)據(jù),你必須設(shè)置變依Destino=vaddress”gvEncerra廣用來(lái)中止處理過(guò)程.(gvEncerrar被設(shè)置為全局變也)超時(shí)時(shí)間設(shè)置“"Inido?12'=12secoftimeout.第1個(gè)程序是用來(lái)準(zhǔn)備WinSock程序?二,代碼intReadBufferUdp(unsignedlong'Destino,void,T,intSize)(charBuffer(128];SOCKADDR_INSockAddr;intLenSockAddr=sizeof(SOCKADDR_IN);fd_setFdRead;structtimevalt_val;intRet;time_tInicio=time(NULL);Appliestion->ProcessMessages();if(gvEncerrar)returnfalse;FD_ZERO(&FdRead);FD_SET(gvSocket.&FdRead);t_val.tv_sec=O;t_val.tv_usec=O;while((Ret=select(0,&FdRead.NULL,NULL,&t_val))!=1&&(Inicio+12)>time(NULL)&&IgvEncerrar)(FD_ZERO(&FdRead);FD_SET(gvSocket,&FdRead);t_val.tv_sec=O;t_val.tv_usec=O;Application->ProcessMessages();if(Ret1=1)returnfalse;if(recvfrom(gvSocket,Buffer,Size,0,(LPSOCKADDR)&SockAddr,&LenSockAddr)!=Size)returnfalse;if(*Desbno==0){'Destino=SockAddr.sin_addr.s_addr;}elseif(*Destino!=SockAddr.sin_addr.s_addr)returnfalse;memcpy(T,Buffer,Size);returntrue;)intWriteBufferUdp(unsignedlongDestino.void*T,intSize)(SOCKADDR_INSockAddr;intSent;Application->ProcessMessages();SockAddr.sin_family=AF_INET;SockAddr.sin_port=gvPortUdp;SockAddr.sin_addr.s_addr=Destino;Sent=sendto(gvSocket,(char,)T,Size,0.(LPSOCKADDR)&SockAddr.sizeof(SockAddr));if(Sent!=Size)returnfalse;elsereturntrue;)voidlnicializaTCPIP()(WORDwVersionRequested;WSADATAwsaData;IN_ADDRIn;PSERVENTPServent;SOCKADDR_INSockAddrln;wVersionRequested=MAKEWORD(1,1);if(WSAStartup(wVersionRequested,&wsaData))(ShowMessage('ErronainidalizaodoTCP/IP");Application->Terminate();return;}//Gettheportonservicefileif((PServent=getservbyname("your_service_name","udp"))==NULL){ShowMessage(aErroobtendoportdoservitransurb/udp");Application->Terminate();return;)gvPortUdp=PServent->s_port;sprintf(StrAux,"Servitransurb/udpport:%d",ntohs(gvPortUdp));Log(StrAux);IIOpendeSocketif((gvSocket=socket(AF_INET.SOCK_DGRAM.O))==INVALID_SOCKET)(ShowMessage('Erronacriaodosockef);Appliedtion->Terminate();return;}Log("Socketcriadocomsucesso");IIDothebindSockAddrln.sinJamily=AF_INET;SockAddrln.s?n_port=gvPortUdp;SockAddrln.sin_addr.s_addr=NULL;if(bind(gvSocket.(LPSOCKADDR)&SockAddrln,sizeof(SockAddrln))==SOCKET_ERROR)(ShowMessage("Erronobinddosocket");Application->Terminate();return;Log("Binddosocketcomsucesso");9、判斷windows的Desktop及其它目錄使用API函數(shù)SHGetSpeaalFolder.shlobj.hサ!イSHGetSpedalFolder的以型聲明”這個(gè)函數(shù)可以幫我們找到windows的DesktopH錄、啟動(dòng)“錄、我的文檔目錄等.SHGetSpecialFolder;A;tt個(gè)參數(shù).第個(gè)參數(shù)是HWND,它指定了“所有后府【ド:在調(diào)用這個(gè)函數(shù)時(shí)可能出現(xiàn)的對(duì)話框或消息框.第個(gè)參數(shù)是個(gè)性教id.決定等個(gè)目錄是特査找目衆(zhòng),它的取值可能是:CSIDL_BITBUCKET回收站CSIDL_CONTROLS控制面板CSIDL_DESKTOPWindows東面desktopCSIDL_DESKTOPDIRECTORYdesktop的n泉CSIDL_DRIVES我的電腦CSIDL_FONTS字體目錄CSIDL_NETHOOD網(wǎng)1.鄰居CSIDL_NETWORK網(wǎng)エ鄰口virtualfolderCSIDL_PERSONAL我的文檔CSIDL_PRINTERS打印機(jī)CSIDL_PROGRAMS程序組CSIDL_RECENT人多數(shù)最近打開(kāi)的文檔列CSIDL_SENDTO"發(fā)送至ザ菜單頊CSIDL_STARTMENU仟?jiǎng)?wù)條用動(dòng)菜單項(xiàng)CSIDL_STARTUP啟動(dòng)“錄CSIDL_TEMPLATES臨時(shí)文檔最后個(gè)參數(shù)是pid!地址.SHGetSpedalFolderLocation把地址《到pidl.ド面的代碼演示了怎樣使用SHGetSpedalFolderLocation:II void_fastcallTForm1::Button1Click(TObject*Sender){LPITEMIDLISTpidl;LPMALLOCpShellMalloc;charszDir[MAX_FWH];if(SUCCEEDED(SHGetMalloc(&pShellMalloc)))(if(SUCCEEDED(SHGetSpecialFolderLocation(NULL,CSIDL_DESKTOPDIRECTORY.Spidl)))(II如果成功返I可trueif(SHGetPathFromlDList(pidl,szDir))Label1->Caption=szDir;pShellMalloc->Free(p<dl);pShellMalloc->Release();}注意:仃”目錄是空的?有些特定的目錄在這個(gè)文件系統(tǒng)上并沒(méi)有個(gè)相應(yīng)的目錄.10、取得本地internet機(jī)叁的名字及IP地址、下面的例子使用WinsockAPI取得本地主機(jī)的名字及地址void_fastcallTForm1::Button1Click(TObject*Sender)(hostent*p;chars(128];char,p2;//Getthecomputernamegethostnamefs,128);p=gethostbyname(s);Memo1->Lines->Add(p->h_name);//GettheIpAddressp2=inet_ntoa(*((in_addr*)p->h_addr));Memo1->Lines->Add(p2);}void_fastcallTForm1::FormCreate(TObject*Sender)(WORDwVersionRequested;WSADATAwsaData;//StartupWinSockwVersionRequested=MAKEWORD(1,1);WSAStartup(wVersionRequested,&wsaData);}void_fastcallTForm1::FormDestroy(TObject*Sender)WSACIeanup();11、用C++Builder創(chuàng)建數(shù)字簽名如果你在網(wǎng)絡(luò)ヒ傳遞份數(shù)據(jù),但卻存在著種種不安全的因素.(由你對(duì)數(shù)據(jù)能否原對(duì)不動(dòng)地到達(dá)目的地向心存疑感,這時(shí),你就可以給數(shù)據(jù)加上數(shù)字簽名.從而使對(duì)方可以通過(guò)驗(yàn)證簽名來(lái)檢件你所傳過(guò)去的數(shù)據(jù)是否已被他人修改.?,程序原理數(shù)字笹名的工作原理還是比較簡(jiǎn)単的.它是根據(jù)你所提供的原始數(shù)據(jù),經(jīng)過(guò)更雜的算法,產(chǎn)生特定的數(shù)據(jù)簽名,對(duì)方通過(guò)同樣的過(guò)程也產(chǎn)生簽名,如果數(shù)據(jù)じ被修改.那么就不可能得到兩份模樣的簽名?從前就可判斷數(shù)據(jù)已被他人修改,編程人員利用Windows的CAPI接口,就可以實(shí)現(xiàn)數(shù)據(jù)的加術(shù)、解密和數(shù)字筌名.二、程序清單下面用C+TBuilder的語(yǔ)句來(lái)看嚇?biāo)木唧w實(shí)現(xiàn)過(guò)程.先來(lái)創(chuàng)建數(shù)字簽名,假定其數(shù)據(jù)來(lái)自于ー個(gè)文件.〃變氏聲明:HCRYPTPROVhProv:〃CSP的句柄HCRYPTHASHhHash:/Z散列的句柄constintBUFFER=4096;II緩沖區(qū)大小常數(shù)BYTEpBufferfBUFFER];II存放讀文件內(nèi)容的緩沖區(qū)BYTEpSignature[256);I!存放簽名的緩沖區(qū)DWORDdSignatureLen=256;I)簽名的長(zhǎng)度TFileStream*sourceFile:IIー個(gè)文件潦if(!CryptAcquireContext(&hProv,NULL,NULL.PROV-RSA-FULL.O))〃連接默認(rèn)的CSP,接受它的句柄放入hProv(II錯(cuò)誤處理)if(?CryptCreateHash(hProv,CALG-MD5,0,0,&hHash))〃創(chuàng)建個(gè)散列對(duì)象,得到它的句柄放入hHash(/Z錯(cuò)誤處理)do(dReadLen=sourceFile->Read(pBuffer,BUFFER);if(!CryptHashData(hHash,pBuffer.dReadLen,O))II根據(jù)文件的內(nèi)容計(jì)算放列值(II錯(cuò)誤處理}}while(!(dReadLen<BUFFER));iftICryptSignHashChHash.AT-SIGNATURE.NULL.O.pSignature.&dSignatureLen))〃使用私人密鈉対散列值進(jìn)行數(shù)字簽名〃給名數(shù)據(jù)放入pSignature.K度放入dSignatureLen/Z錯(cuò)誤處理)対基尸文件的數(shù)據(jù)簽名進(jìn)行檢驗(yàn).〃變量聲明:HCRYPTPROVhProv:〃CSP的句柄HCRYPTHASHhHash;/Z做列的句柄HCRYPTKEYhPublicKey;I/公共あ鑰的句柄constintBUFFER=4096;I/緩沖區(qū)大小常數(shù)BYTEpBuffer(BUFFER];II存放讀文件內(nèi)容的緩沖區(qū)TFileStream*sourceFile://一個(gè)文件流BYTEpSignature[256];〃上一段得到的簽名的緩沖區(qū)DWORDdSignatureLen:II上一段得到的簽名的長(zhǎng)度if(!CryptAcquireContext,&hProv,NULL,NULL.PROV-RSA-FULL.O))〃連接默認(rèn)的CSP,接受它的句柄放入hProv(〃錯(cuò)誤處理}if(!CryptGetUserKey(hProv,Ar_SIGNATURE.&hPublicKey):II得到公共密籍的句柄(I!錯(cuò)謨處理)if(!CryptCreateHash(hProv,CALG-MD5.0.0,&hHash))/Z創(chuàng)建個(gè)散列對(duì)號(hào),得到它的句柄放入hHash(I!錯(cuò)誤處理)do(dReadLen=sourceFile>Read(pBuffer,BUFFER);if(!CryptHashData(hHash,pBuffer,dReadLen.O))II根據(jù)文件的內(nèi)容計(jì)算改列值(〃錯(cuò)誤處理}}while(!(dReadLen<BUFFER));iftfCryptVerifySignaturethHash.pSignature.dSignatureLen.hPublicKey.NULL.O))if(GetLastError()==NTE-BAD-SIGNATURE)ShowMessageC、件し!被修改");else(ShowMessage("更件沒(méi)被修改");)以上是個(gè)數(shù)字卷名的簡(jiǎn)単?實(shí)現(xiàn),得到的簽名數(shù)據(jù)可以用獨(dú)保な,也可以分開(kāi)保存.12、用Enter?控制焦點(diǎn)切換的方法在Windows環(huán)境ド,要使?個(gè)控件取得焦點(diǎn),,リ在該控件上用鼠標(biāo)單擊中或按Tab鍵將供點(diǎn)移至該控件匕這種控制焦點(diǎn)切換的方法有時(shí)不符合用戶的習(xí)慣.用戶希望用Enter錠?控制焦點(diǎn)由Edit!切換到Edi2要實(shí)現(xiàn)這樣的功能需借助WinAPI的數(shù)SendMessage來(lái)完成?方法是:先設(shè)Forml的KeyPreview屬性為true應(yīng)后dForml的。nKeyPress驛件中并入如ド的代碼.這樣,用戶就可以通過(guò)按Enter,鍵捽制焦點(diǎn)按定義好的Taborder順序來(lái)移動(dòng)了!voidfastcallTForml::FormKeyPress(TObject,Sender,char&Key)(if(Key==VK_RETURN)(SendMessage(this->Handle,WM_NEXTDLGCTL,O,O);Key=0;13、攔?Windows消息--BorlandC++Builder的API后門(mén)一引子——C++Builderイ;愧為Borland公司的優(yōu)秀產(chǎn)品?用它來(lái)開(kāi)發(fā)Windows程序非??旖荻?但在編程過(guò)程中你也會(huì)發(fā)現(xiàn)它的些限制忤?止你無(wú)法實(shí)現(xiàn)いビ的想法?比如你無(wú)法在修改衣單的系統(tǒng)菜單;比如使用跟蹤欄時(shí),你找不到StartTrack和EndTrack労件,而偏褊你的程序需要這兩個(gè)事件?WindowsAPI編科中,你就不會(huì)有這峠麻煩,只需處理卜WM_SYSCOMMAND和WM_HSCROLL(或WM_VSCROLL)消息,就能實(shí)現(xiàn)上述功能。WindowsAPI的胡點(diǎn)是編程十分麻煩,太多的時(shí)間要耗在細(xì)節(jié)上面,但它的功能卻是最強(qiáng)大的.C++Builder的VCL在功能上只是它的個(gè)子集,因?yàn)閂CL是在API的基礎(chǔ)上封裝的,時(shí)裝時(shí)舍棄了?些不常用到的功能。但是程序員的想象カ沒(méi)有被封裝,他們總懷著更大的熱情去實(shí)現(xiàn)別出心裁的想法,修收系統(tǒng)菜單和給跟蹤欄增加StartTrack和ndTrack小件只是或中的小把戲而(2.可是VCL并沒(méi)仃這些功能,怎么辦?——幸好,Bortand公司沒(méi)仃把路堵死,而是留了個(gè)后門(mén)一允許程序員自己攔截并處珅Windows消息,就東API編程一樣。于是,辦法有了...—方法一攔極Windows消息需要以F幾歩:——在表單頭文件內(nèi)(如Unitl.h)——1.在類聲明中建立消息映射表,把某條消息的處理權(quán)交給H定義的消息處理函數(shù)。BEGIN_MESSAGE_MAPMESSAGE_HANDLER(Windows消息名,TMessage.消息處理函數(shù)8)MESSAGE_HANDLER(...)END_MESSAGE_MAP(TForm)—2.在類聲明的private區(qū)內(nèi)聲明消息處理函數(shù)。private://Userdeclarationsvoid_fastcal(消息處理函數(shù)^(TMessage&Message):在表單文件內(nèi)(如UnitLcpp)——3.寫(xiě)出消息處理函數(shù),在這里實(shí)現(xiàn)你需要的功能。比如void_fastcallMainForm::OnWMHScroll(TMessage&Message)(...//在此加入你自己的代円TForm::Dispatch(&Message);}——解樣——1.關(guān)于TMessage——TMessage是VCL隨定義的結(jié)構(gòu),定義如ド:structTMessage(unsignedintMsg;〃消息intWParam;〃字參數(shù)intLParam;〃氏字參數(shù)intResult:〃消息結(jié)果—2.X;FTForm::Dispatch(&Message)——自定義的消息處理函數(shù)末尾最好加,句TFom::Dispatch(&Message),這旬的作用是讓消息繼續(xù)傳遞F去.如果沒(méi)有這一句,消息將被完全攔截.VCL類可能由于斛不到消息而無(wú)法實(shí)現(xiàn)正常功能,一實(shí)例ー:修改系統(tǒng)菜單——有ー些程序,主窗口很小,菜單也沒(méi)有,如果想加入關(guān)于或設(shè)置對(duì)話框,最好的辦法是拿系統(tǒng)菜單開(kāi)刀.WindowsAPI編程中,修改系統(tǒng)菜單ヮ實(shí)現(xiàn)其他功能樣.不太容易,也不會(huì)太難.但在C++Builder中,表單類(TForm)沒(méi)仃提供有關(guān)系統(tǒng)菜單的任何網(wǎng)性與方法.實(shí)現(xiàn)其他功能易如反掌?肉修改系統(tǒng)菜單似乎難尸上青天.——還好,Borland公司允許程序員自己處理Window消息,J是機(jī)會(huì)來(lái)了!、用WindowAPI函數(shù)修改系統(tǒng)菜單假定我單名為MainForm.設(shè)苴MainForm::OnCreate()函數(shù):1,用GetSystemMenu(MainFom?Handle,false)収得系統(tǒng)菜單句柄:2.用AppendMenu,DeleteMenu,ModifyMenu曲數(shù)修改系統(tǒng)菜單,把新的ID號(hào)賦1白定義的菜單項(xiàng)。這時(shí)運(yùn)行程序.可以看到系統(tǒng)菜單也被修改.但自定義的菜單項(xiàng)卻不能被響應(yīng).、ド:截WM_SYSCOMMAND消息以響應(yīng)!*|定義的菜第頊住農(nóng)單買(mǎi)文件內(nèi)(如Unitl.h).在表單類定義末兄加入消息響尚衣,取得WM_SYSCOMMAND消息的處理權(quán)BEGIN_MESSAGE_MAPMESSAGE_HANDLER(WM_SYSCOMMAND.TMessage.OnWMSysCommand)END_MESSAGE_MAP(TForm).在我單類定義的private區(qū)內(nèi)加入消息處理函數(shù)い明private://Userdeclarationsvoid_fastcallOnWMSysCommand(TMessage&

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論