C++Builder入门资料

上传人:微*** 文档编号:171400774 上传时间:2022-11-26 格式:DOCX 页数:44 大小:94.34KB
收藏 版权申诉 举报 下载
C++Builder入门资料_第1页
第1页 / 共44页
C++Builder入门资料_第2页
第2页 / 共44页
C++Builder入门资料_第3页
第3页 / 共44页
资源描述:

《C++Builder入门资料》由会员分享,可在线阅读,更多相关《C++Builder入门资料(44页珍藏版)》请在装配图网上搜索。

1、C+Builder 入门怎样在C+ Builder中创建使用DLL自从C + Builder从去年浪漫情人节上市以来,吸引了大量的Delphi、VC, Vb的程序员到它的怀抱,大量的C、C+程序员感叹道:总算有了 C的可视化开发工具,对我也是样,从 BC、Delphi 到 C + Builder。动态链接库(DLL)是Windows编程常遇到的编程方法,下面我就介绍一下在BCB (C+Builder下筒称BCB)中如何创建使用DLL和一些技巧。、创建:使用BCB FilelNEW建立一个新的DLL工程,并保存好文件BCB,生成一个DLL的程序框架。1 . DllEntryPoint函数为个入口

2、方法,如果使用者在DLL被系统初始化或者注销时被调用,用来写入对DLL的初始化程序和卸载程序;参数:hinst用来指示DLL的基地址;reason 用来指示DLL的调用方式,用于区别多线程单线程对DLL的调用、创建、卸载DLL;2 .在程序中加入自己所要创建的DLL过程、函数;3 .用 dllimport 描述出口;例程序如下:# include# pragma hdrstopextern 舉?_declspec(dllexport) int test();int WINAPI DIIEntryPoint(HINSTANCE hinst, unsigned long reason, void*

3、)(return 1;int test()(return 3;)注意:动态链接库中调用过程、函数时有不同的CALL方式cdecl、_pascal,_fastcalk _stdcall, BCB中默认的方式为_cdecl(可不写),如果考虑兼容性可用时stdcall声明方法为:extern 攣?_declspec(dllexport) int _stdcall test();对于其中过程、函数也改为:int _stdcall test()二、使用DLL在BCB中使用DLL有两种方法:1 .用静态调用法首先需要在BCB的项目中加入输入接口库(import library),打开工程项目,使用 BC

4、B ViewlProject Manager打开项目列表,向项目中加入接口库(* Jib)。其次在头文件中加入接口声明。例程序如下:/define in include fileextern 掣?_declspec(dUimport) int _cdecl test();/use function in main programint I;I=test();注意:(1)动态链接库调用过程、函数时CALL方式与创建时方式样不写为_cdecl,其它需要声明。(2)BCB创建的DLL有对应的输入接口库(import library),如只有DLL而无库时,可用BCB 的 implib 工具产生:im

5、plib xxx.lib xxx.dll;另外可用:tlib xxx.lib,xxx.lst 产生 DLL 的内部函数列表,许多Windows的未公开技术就是用这种方法发现的。2 .动态调用法动态调用法要用Windows API屮的LoadLibrary()和GetProcAddress。来调入DLL库,指出库中函数位置,这种方法较常见。例程序如下:HINSTANCE dd;int _stdcall (* ddd)(void);dd=LoadLibrary(W xx.dll?;ddd=GetProcAddress(dd指 est?;Caption=IntToStr(ddd();FreeLibr

6、ary(dd);三、注意:创建DLL时编译链接时注意设置Project Options.Packages 标签:去除 Builder with runtime packages 检查框。Linker标签:去除Use dynamic RTL检査框。否则创建的 DLL 需要 Runtime packages or Runtime library。用C+Bulider在WIN.IN!中保存信息现在许多软件把程序中需要的数据保存在注册表中,这样当用户装的软件越来越多时,致使注册表越来越庞大,容易使系统出错。当然,微软也建议在注册表中保存数据,但当我们需要保存的数据不多时完全可以把数据保存在WIN.IN

7、I中,这样可以很方便地维护,实现方法相对来说比较简单。面我以Borland C+ Builder为例来说说如何实现。原理其实很简单,只需调用API的WriteProfileString和GetProfilelnt函数就可以了。这两个函数的原型是: BOOL WriteProfileString(LPCTSTR lpAppName,LPCTSTR lpKeyName,LPCTSTR IpString );UINT GetProfileInt(LPCTSTR lpAppName,LPCTSTR IpKeyNameJNT nDefault);其中!pAppName指在WIN.INI中段的名字,即用口

8、括起来的字符串,IpKeyName指在这个段中每个项目的名字,IpString指这个项目的值,即“=”后的数,nDefault为当 GetProfilelnt没有找到IpAppName和!pKeyName时返回的值,即缺省值,前者返回为布尔值(true或false),后者返回为无符号整形值。当在 WriteProfileString函数中IpKeyName为空(NULL)时,则清除这个段的全部内容,IpString为空时,则清除这项目的内容,即这一行将清除掉。下面举一例子来说明这两个函数的用法。新建一个应用程序,在Forml上放两个Edit 和三个Button,其中Edit的Text为空,三个

9、Button的Caption分别为“添加”、“查看”、“清除”。双击“添加”按钮加入下面代码:WriteProfileString(例子程序,项目,Editl-*Text.c_str();双击“查看”按钮加入如下代码:unsigned int Temp;Temp=GetProfileInt(例子程序”,“项目”,10);Edit2-Text=IntToStr(Temp);双击“清除”按钮加入如下代码:WriteProfileString(“例子程序”,NULL, NULL);然后按F9键运行程序。下来可以检验下程序的正确性。在Editl中输入数字,如3265”,按添加”按钮,这时运行sysed

10、it”来查看“WIN.INI”文件的最后面,可以看到加入了如下内容:例子程序项目=3265其中”和=”是函数自动加上的。按下查看”按钮,在Edit2中出现3265”,当按下清除”按钮可清除添加的部分。经过查看可知程序已达到预期的目的。喜爱编程的朋友可以把上述方法应用到自己的程序中去,来达到保存数据信息的作用。当确实要把信息保存到注册表中,可以在C+ Builder中定义个TRegistry类的对象来进行相关的操作,或者直接调用Windows的API函数,具体如何编程大家可以参阅相关资料或者同我联系。如何在C+ Builder中检测硬件在我们编写的程序中常常要和硬件打交道,那么如何在程序中确定系

11、统中是否有该设备,它的运行状态又是怎样的呢?对于初学者来说,这个问题常常不好解决,其实只需简单地利用几个AP!函数,硬件的问题并不神秘。下面就让我们起看看在C + Builder中是如何检测硬件的。1 .检测CPU的型号先让我们从最简単的做起,看一看自己的CPU型号。首先,在C+Builder中画出图!所示的窗体,在下面的几个例子中我们将一直使用这个窗体作示范,它包括一个用来激活测试的Button和一个用来显示结果的Memo我们可以用GetSystemlnfo这个AP!获得CPU 的型号。将列代码添加到Button的Click事件里就可以了:void _fastcall TForm 1:But

12、ton 1 Click(TObject * Sender)(获得CPU型号SYSTEM_INFO systeminfo;GetSystemlnfo (& systeminfo);Metnol -Linesf Add(撃腾 PU 类型是:散旅 tring( systeminfo.dwProcessorType );)运行它,点击Test试试,CPU型号出来了吧!2 .检测内存状态获得内存状态的方法和CPU型号差不多,只是他用到的是另外一个API: GlobalMemoryStatus。其中,成员dwTotalPhys用来获得物理内存总量,而dwAvailPhys顾名思义是有效物理内存的意思。我们

13、只要把下面几行代码加到上面程序的后面就可以了(不用重做,下同):获得内存状态MEMORYSTATUS memory;memory.dwLength =sizeof(memory);初始化GlobalMemoryStatus(& memory);Memol f Lines - Add(撃奈锢昨桂婿?Mb):敗旅tring(int(memory.dwTotalPhys /1024/1024);MemolfLines-Add(撈渲锌捎媚让姨?Kb):敗旅 tring(int( memory.71024);怎么样,看出点门道了么?两段程序的格式几乎模样,其实, GetSystemlnfoGlobalM

14、emoryStatus还可以获得许多其他有关CPU和内存的信息,就按照上面的格式去套就行了,更详细的资料可以去看C+ Builder4的Help。3 .检测可用硬盘空间好了,经过前面两个简单问题的热身,我们来处理一个稍微复杂的问题:我们知道安装程序大都有一个检测硬盘空间的过程,那么这是怎么实现的呢?他用到的是API函数 GetDiskFreeSpace,这个函数输入个参数:目标盘的路径:返回四个参数,依次是每簇的扇区数、每扇区的字节数、空闲的簇数、总簇数。假如我们需要检测C盘的总容量和可用容量,那么可以把以下代码加到上面的程序中:获得C盘可用空间DWORD sector,byte.cluste

15、r,free;long int freespace,totalspace;GetDiskFreeSpace(挈:?& sector,& byte,& free,& cluster);获得返回参数 totalspace=int(cluster)* int(byte)* int(sector)/1024/1024;计算总容量 freespace=int(free)* int(byte)* int(sector)/1024/1024;计算可用空间Memol LinesAdd(攣盘总空间(Mb):敗旅 tring(totalspace);MemolLinesf Add(攣盘可用空间(Mb):敗旅 tr

16、ing(freespace);怎么样?现在可以自己做安装程序了吧!C+Builder如何响应消息及自定义消息Inprise(Borland)C+Builder中,可以象在Delphi中一样响应消息,只是看起来要稍复杂点。对于系统已定义的消息,可以直接响应:#define WM_MY_OPEN_CMDLINE_FILE (WM_USER+1)/进程间通讯的自定义消息#define WM_MY_SEARCH_NODE (WM-USER+2)/查找命令的自定义消息class TSomeForm : public TForm(类中的其它代码protected:消息的响应过程void _fastcall

17、 OpenCmdLineFile(TMessage Message);void _fastcall SearchDocumentNode(TMessage Message);void _fastcall GetWindowMinMaxInfo(TWMGetMinMaxInfo Message);以下通过宏定义实现消息的正确响应BEGIN_MESSAGE_MAPMESSAGE_HANDLER(WM_MY_OPEN_CMDLINE_FILE, TMessage, OpenCmdLineFile) MESSAGE_HANDLER(WM_MY_SEARCH_NODE, TMessage, Search

18、DocumentNode) MESSAGE_HANDLER(WM_GETMINMAXINFO , TWMGetMinMaxInfo, GetWindowMinMa xln fo)END_MESSAGE_MAP(TForm);/end class 以下为实现代码void _fastcall TSomeForm:OpenCmdLineFile(TMessage Message)直接通过消息结构传递参数LPSTR lpCmdLine=(LPSTR)Message.LParam;从 Message 中取得参数 thisHandleCmdLineFile(lpCmdLine);处理命令行的参数retur

19、n;void _fastcall TSomeForm:SearchDocumentNode(TMessage Message)响应查找消息/Message中的参数在此处不需要。this-SearchNode();return;)void _fastcall TSomeForm:GetWindowMinMaxInfo(TWMGetMinMaxInfo Messag e)(设置主窗口的最小尺寸MINMAXINFO *MinMaxInfo=Message.MinMaxInfo;MinMaxInfo-ptMinTrackSize.x=400;MinMaxInfo-ptMinTrackSize.y=30

20、0;return;其中:TMessage和TWMGetMinMaxInfo类型的定义可参见:C:Program FilesBorlandCBuilderinlucdevclMessages.hpp:其它的消息响应方法与此相同。另外,可以为自定义的消息也定义一个对应的消息结构(如:TSearchNode_Mes sage),至于如何定义消息结构,可以参考:C:Program FilesBorlandCBuilderinlucdevclMessages.hpp利用C+ Builder开发动画DLL我们在Windows98环境卜.执行拷贝文件、查找文件或计算机等耗时比较长的操作时, Windows会

21、显示个小小的动画,指示正在进行的操作,与死板的静止图像相比增色不少。那么我们自己开发软件时,能否也显示一个这样的动画提示呢?我在开发个外贸应用软件系统时,遇到的数据量很大,当通过复合条件查找时,因为不是数据库表的每个项目都有索引,所以很费时,系统也会表现出长时间停顿,用户感觉极为不爽。我经过一段时间的探索,开发了一个能够在采用的开发环境PowerBuilder下调用的动画DLL,由于采用多线程编程, PB调用的DLL函数能够及时将控制权交还为PB,不影响应用系统的运转。用户能够看到个东西在动,也就不会想到系统是不是停止响应了,感觉时间也似乎没那么久了。代码与编译选项(1)在C+Builder的

22、File菜单下选择New,在New Item对话框的New属性中选择DLL, C+Builder就会创建一个空白的DL项目。(2)在File菜单下选择New Form, C+Builder创建一个空白的Form,修改它的属性为 BorderStyle=bsDialog Bordericons的子属性均为False FormStyle=fsStayOnTopPosition= poScreenCenterName=StatusForm(3)在Form上添加一个Win32下的Animate控件Animate 1,修改它的属性为 Align=alTop(4)在Form上添加一个Standard下的B

23、utton控件Button_CanceL再添加System下的 Timer控件Timerl,设置定时Interval时间位250,以较快的响应用户的取消请求。因为PB应用系统与动画窗体代码分别属于两个线程,不能采用PB线程直接关闭动画窗体线程的窗,否则会引起系统运行不正常,因此采用PB线程设置关闭标志,而动画线程采用Timer控件定时检查标志,一旦检测到关闭标志,就关闭窗口,清除线程标志,结束动画线程。下面给出编码及编码原理:1. DLL DLL主体代码:* DLL主体代码* 定义DLL公用变量* g_CommonAVI对Animate控件动画类型索引* gi_CanceledButton_C

24、ancel按钮是否被选择过* gi_AVIType要显示的动画类型,由DLL输出函数做为参数输入* gi_RequestClose请求动画线程关闭标志* gi_WindowActive动画窗口所处的状态* IpsWinTitle动画窗体的标题,由DLL输出函数做为参数输入刊TCommonAVI g_CommonAVI= aviNone, aviFindFolder, aviFindFile, aviFindComputer, aviCopyFiles, aviCopyFile, aviRecycleFile, aviEmptyRecycle, aviDeleteFile);int gi_Can

25、celed=O,gi_AVIType=O;ini gi_RequestClose=0,gi_WindowActive=0;char lpsWinTitle256;HWND hWndParent=NULL;/*定义DLL输出函数*/externdeclspec(dllexport)int pascal DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*);externdeclspec(dllexport) intpascal ShowStatusWindow(int AV (Type, LPSTR WinTitle,long hW

26、nd);extern Cn _declspec(dllexport) int pascal GetStatus(int ai_CloseWin);extern HC_declspec(dllexport) int pascal CloseStatusWindow();/定义线程 TformThread:*/class TFormThread : public TThread public:/ User declarations_fastcall TFormThread(bool CreateSuspended); void _fastcall Execute(void);;_fastcall

27、TFormThread:TFormThread(bool CreateSuspended): TThread(CreateSuspended)/动画线程执行代码,动画窗体的定时器控件会关闭它,清除窗体存在标志后结束线程的运行*/void _fastcall TFormThread:Execute(void) gi_WindowActive=l;StatusForm=new TStatus Form(N U LL);StatusForm-Caption=lpsWinTitle;StatusForm-ShowModal();gi_WindowActive=0;delete StatusForm;g

28、i_RequestClose=0;/定义个线程实例指针 TFormThread *FormThread;输出函数代码实现部分DllEntryPoint 32位 DLL 入口ShowStatusWindow 显示动画窗口,它通过创建一个线程来创建窗口,避免由于窗口的MODAL属性而使控制权不能及时的返还给调用者* GetStatus取得攔N度状态,即用户有没有选择攔N廨按钮* CloseStatusWindow 关闭动画窗口,列declspec(dllexport) int WINAPI DllEntryPoint (HINSTANCE hinst, unsigned long reason,

29、void*)( return 1;_declspec(dllexport) int pascal ShowStatusWindow(int AVIType,LPSTR WinTitle,long hWnd) hWndParent=(HWND)hWnd;memset(lpsWinTitle,0,sizeof(lpsVinTitle); stmcpy(lpsWinTitle, WinTitle,sizeof(lpsWinTitle)-1); if(AVIType 0& AVITypePriority = tpNormal; FormThread-Resume();_declspec(dllexpo

30、rt) int pascal GetStatus(int ai_CloseWin) if (gi_Canceled) if (gi_WindowActive) gi_RequestClose=1;while(gi_RequestClose); return gi_Canceled;_declspec(dllexport) int pascal CloseStatus Wi ndow() if (gi_WindowActive) gi_RequestClose=1;while(gi_RequestClose);return gi_Canceled;2.窗体StatusForm的代码: TStat

31、usForm *StatusForm;/-extern int gi_Canceled;extern int gi_AVIType;extern TCommonAVI g_CommonAVI;fastcall TStatusForm:TStatusForm(HWND Parent Window):TForm(ParentWindow)( gi_Canceled=O;/取消按钮并不直接关闭窗体,而指示设置取消标志,供调用者查看 void _fastcall TStatusForm: Button_CancelClick(TObject *Sender)( gi_Canceled=l;/ Moda

32、lResult=mrCancel;)/激活动画,在FORMCREATE事件中void _fastcall TStatusForm:FormCreate(TObject Sender)(Animate 1-CommonAVI=g_CommonAVIgi_AVIType;Animate!-Active = true;/extern int gi_RequestClose;/Z定时器事件检测到结束标志关闭窗体 void _fastcall TStatusForm: Timer 1 Timer(TObject Sender)(if (gi_RequestClose) ModalResult=mrOk;

33、/(5)设置编译选项:Project-Options打开Project Options对话框,清除Linker属性页中的 Use Dynamic RTL 标志,清除 Packages 属性页中的 Build with runtime packages这样只要单个DLL就可以运行了,而不必安装些动态连接运行时间库。使用动画DLL 上面编译出DLL可以由其它任何开发语言调用,下面给出在PB中的使用方法。(1)定义:/Declare - Global External FunctionsFUNCTION Long ShowStatusWindow(LongAVIType,String WinTitl

34、e,long hWnd)&LIBRARY STATWIN.DLL ALIAS FOR ShowStatusWindowFUNCTION Long GetCancelStatus(Long Close Window)&LIBRARY “STATWIN.DLL” ALIAS FOR “GetStatus”FUNCTION Long CloseStatusWindow()&LIBRARY “STATWIN.DLL” ALIAS FOR CloseStatusWindow(2)调用:long ll_EndTime显示查找文件夹动画ShowStatusWindow(2)setpointer(HourGl

35、ass!)ll_EndTime = Cpu()+10*1000DOif GetCancelStatus(O)=l then exitend if做想做的事情LOOP UNTIL cpu() ll_EndTimeCloseStatusWindow()用C+ Builder 3制作屏幕保护程序屏幕保护程序是以scr为扩展名的标准Windows可执行程序,在激活控制面板的显示器属性的屏幕保护程序页时,该模块会自动在Windows启动目录(Windows目录和系统目录)下查找扩展名是scr的基于Windows的可执行文件。使用屏幕保护程序,不仅可以延长显示器的使用寿命,还可以保护私人信息。编制屏幕保护

36、程序不仅要涉及消息的处理,还要涉及命令行参数的处理。在WIN32SDK 文档中描述了编制基于WIN32的标准的屏幕保护程序所必须遵守的严格标准。按照这些标准,屏幕保护程序必须要输出两个函数:ScreenSaverProc和ScreenSaverConfigureDialog,但是,在Windows系统中的很多屏幕保护程序并没有遵循这些标准(使用impdef或者tdump 实用工具查看即可)。并且使用该文档中介绍的方法编写屏幕保护程序,不仅要使用资源编辑器,并且在链接时还要利用Scrsaver.lib文件(在C+Builder3环境,不能成功连接)。不仅要涉及消息的处理,还要涉及命令行参数的处理

37、。C+Builder3是种快速的应用程序开发工具,提供了许多类型的应用程序开发模板,但没有提供开发屏幕保护程序的模板,并且在其在线帮助中也没有提及如何开发这类应用程序。经过本人的研究,找到了用C+Builder3编制屏幕保护程序的方法。在控制面板的“显示器属性“项的“屏幕保护程序页中进行设置时,要遇到三种类型的命令行参数,并且,各种情况下的屏幕保护程序的显示结果也各不相同,般来讲,就需要三种类型的窗体(或两种,在随后的内容中讨论)。下面将分四步来具体地说明如何编制屏幕保护程序。、屛幕保护程序的选择如果在标题为”屏幕保护程序”的下拉列表框中选中了某个保护程序时,系统会自动启动该程序,这个程序的显

38、示范围是在这个页面上的显示器图形的屏幕范围,同时,会将两个命令行参数:一个是”/P”:另个是显示窗口的句柄,传递给这个被选中的程序。因此,这类程序首先应该能够处理命令行参数。在C+Builder3中,与命令行参数处理有关的函数是: ParamCount。和ParamStr()具体的申明方式如下:1. externPACKAGEint_fastcallParamCount(void);该函数返回命令行参数的个数,但不包含应用程序本身。2. externPACKAGEAnsiString_fastcallParamStr(intlndex);该函数返回指定索引值的命令行参数。ParamStr(O)

39、返回的是应用程序本身。所以,在这以步骤中的参数判断的语句如下:if(UpperCase(ParamStr(1)=,-p,IIUpperCase(ParamStr(i)=,/p)(/addthecodeinhere在完成了参数判断后,就应该对显示窗口的处理,为能够使程序在显示器图形的屏幕区域内显示,就要重新设置程序的父窗口和显示区域。这要涉及到父窗口句柄的获得及父窗口的设置,以及API函数的调用。这种环境下的父窗口句柄就是传递过来的第二个命令行参数;要设置父窗口,只需设置窗体的ParenlWindow属性即可。这段程序如下: RECTrc;/LinelHWNDhWnd=(HWND)(atol(P

40、aramStr(2).c_str();/Line2:GetClientRect(hWnd,&rc);/Line3Parent Wi ndo w=h Wnd ;/Li ne4Left=rc.left;/Line5Top=rc.top;/Line6Width=rc.right-rc.left;/Line7Height=rc.bottom-rc.top;/Line8在上面的程序片段中,第2行语句是将传递过来的第2个参数转换成窗口句柄:然后,第3行语句利用这个窗口句柄,调用API函数以获得该窗口的客户区域;第4行语句将选中的屏幕保护程序的父窗口设置为指定的窗口;余下的语句是将该程序的窗口大小设置成副窗

41、口的客户区大小。这程序片段的位置应该是在窗体的OnCreate事件处理中。需要说明的是,这种类型(包括第三步介绍的窗体)的窗体样式应是: FormStyle=fsStayOnTop;窗体边界的样式应为:BorderStyle=bsNone;当然,这时也不需要鼠标图形,因此,可以将鼠标的形状设为crNone: Cursor=crNone;二、初始化参数的设置单击”显示器属性”模块的屏幕保护程序页面中的“设置”按钮时,系统会启动指定的保护程序的初始值设置对话框,这时传递过来的命令行参数是:”/C”或”-C”(参数的处理与前面介绍的相同)。通过该对话框,可以设置保护程序的一些初始参数,比如图形的变化

42、快慢等。在这段程序中,还要涉及到初始化文件或注册表的读写,用以记录初始化参数,便于保护程序启动时使用。三、预览及运行预览的效果就是屏幕保护程序被激活后的显示。单击单击”显示器属性”模块的”屏幕保护程序”页面中的”预览”按钮,就可以观察保护程序运行的实际效果。这时,系统启动该程序时传递过来的命令行参数是:”/S”或”-S”。对于命令行参数的处理与前面的步骤相同,但在这步中,还要对几个消息进行处理,这些消息是:WM_MOUSEMOVE , WM_LBUTTONDOWN ,WM一MBUTTONDOWN , WM_RBUTTONDOWN ,WM_KEYDOWN, WM一ACTIVATE。对 WM一MO

43、USEMOVE 和 WM_ACTIVATE 消息的处理形式如下:void_fastcallHandleSomeMessage(TMessage&Msg)(switch(Msg.Msg)/caseWM_ACTIVATE:if(Msg.WParamLoWANACTIVE)Close();break;caseWM_MOUSEMOVE:if(OldMouseX=-l &OldMouse Y=-1)/Intheconstructor,OldMouseXandOldMouseY mustbeinitializedby-1.OldMouseX 二 Msg.LParamLo;OldMouseY二 Msg.LP

44、aramHi;)elseif(OldMouseX!=M sg. LParamLo1101dMouse!二 Msg.LParamHi)Close();break;对于其他的消息仅仅是调用Close。函数来关闭应用程序即可。应用这种消息处理方式时,必须要类定义时进行消息映射,不然的话,就要在相应的消息响应中进行处理(使用一定的布尔变量,就可以与第一步合用个窗体)。与第一步类似,在该步骤中,也不需要具体的鼠标指针的形状,因此,将鼠标指针设为 crNone:Cursor=crNone;四、修改项目源文件在C+Builder3中,一个窗体也就是个类,换句话说,具有某些特性的类也就是个窗体,因此,编制屏幕

45、保护程序时,也不需要什么主窗体,同时,也不用自动创建某些窗体了,这时就要修改项目源文件,下面所列出的程序就是笔者在编制某屏幕保护程序时使用的项目源文件,供读者参考。WINAPIWinMain(HINSTANCE,HINSTANCE,LPSTR,int)(CreateMutex(NULL,true,ScreenSaver);if(GetLastError()!=ERROR_ALREADY_EXISTS)(try(Application-Initialize();ApplicationTitle=屏幕保护程序测试”;if(UpperCase(ParamStr(1)=7CHIIUpperCase(P

46、aramStr(1)=H-CMI IParamCount()=0)TScrSaverConfiguerF*ScrCfg=newTScrSaverConfiguerF(NULL);ScrCfg-ShowModal();deleteScrCfg;returnO;单击“设置”按钮elseif(UpperCase(ParamStr(1)=P”IIUpperCase(ParamStr(1)=-P)TScrForP*ScrFP=newTScrForP(NULL);ScrFP-ShowModal();deleteScrFP;retumO;在”屏幕保护程序”下拉列表框中选择个程序elseif(UpperCas

47、e(ParamStr(1)=S”IIUpperCase(ParamStr(l)=-S”)TScreenSaveF*ScreenSave=newTScreenSaveF(NULL);ScreenSave-ShowModal();deleteScreenSave;retumO;单击“预览”按钮,及运行屏幕保护程序elsereturn 1;catch(Exception&exception)(Application-ShowException(&exception);) retumO;/theWinMainFunctionend前面介绍了在C+Builder3下编制屏幕保护程序的方法.对于C+Bui

48、lder3这种RAD具来讲,开发这类程序也是相当方便的,按照前述的方法,可以在极短的时冋开发出屏幕保护程序。对于屏幕保护程序,在本文中没有说明的就是如何设置口令的问题,这部分就由读者自己摸索吧。TCP/IP头格式、先是常用的1P头格式。 IP头格式:版本号(4位)IP头长度(4位)服务类型(8位)数据包长度(16位)标识段(16位)标志段(16位)生存时间(8位)传输协议(8位)头校验和(16位)发送地址(16位)标地址(16位)选项填充简单说明1.IP头长度计算所用单位为32位字,常用来计算数据开始偏移量2 .数据包长度用字节表示,包括头的长度,因此最大长度为65535字节3 .生存时间表示

49、数据被丢失前保存在网络上的时间,以秒计.4 .头校验和的算法为取所有16位字的16位和的补码.5 .选项长度是可变的,填充区域随选项长度变化,用于确保长度为整字节的倍数.描述struct iphdr BYTE versionihl;BYTE tos;WORD tot_len;WORD id;WORD frag_off;BYTE ttl;BYTE protocol;WORD check;DWORD saddr;DWORD daddr;/* Put options here.*/);二、TCP头格式 TCP头格式:源端口(16位)目的端口(16位)序号(32位)确认号(32位)数据偏移(4位)保留

50、(6位)标志(6位)窗口(16位)校验和(16位)紧急指针(16位)选项填充简单说明1 .数据偏移用于标识数据段的开始2 .保留段6位必须为03 .标志包括紧急标志、确认标志、入栈标志、重置标志、同步标志等。4 .校验和计算方式为将头与16位二进制反码和中的16位二进制反码加在起。5 .选项长度是可变的,填充区域随选项长度变化,用于确保长度为整字节的倍数.6 .更详细的说明请参阅有关资料。描述struct tcphdr WORD SourPort;WORD DestPort;DWORD SeqNo;DWORD AckNo;BYTE HLen;BYTE Flag;WORD Window;WORD

51、 ChkSum;WORD UrgPtr;/* Put options here.*/);UDP一、说明使用UDP时,直接使用API代替控件。第一个程序(ReadBufferUdp)使用来接收到缓存中。“Destino”变量非常重要,如果你从其他地方接收数据到Buffer,你必须设置Destino =0并且在以后执行的时候赋值你将要发送的包的地址给它(after the execution it will have the address which send you the packet.)如果你只想从个指定的地址接收数据,你必须设置变量Destino =address.gvEncerrar”

52、用来中止处理过程。(gvEncerrar被设置为全局变量。)超时时间设置。Inicio +12=12 sec of timeout.第三个程序是用来准备WinSock程序。二、代码int ReadBufferUdp(unsigned long *Destino,void *T,int Size)(char Buffer128;SOCKADDRJN SockAddr;int LenSockAddr=sizeof(SOCKADDR_IN);fd_set FdRead;struct timeval t_val;int Ret;time_t Inicio = time(NULL);Applicatio

53、n-ProcessMessages();if(gvEncerrar)return false;FD_ZERO(&FdRead);FD_SET(gvSocket,&FdRead);t_val.tv_sec=O;t_vaLtv_usec=O;while(Ret=select(O,&FdRead,NULL,NULL,&t_val)!=l &(Inicio +12) time(NULL)&!gvEncerrar)FD_ZERO(&FdRead);FD_SET(gvSocket,&FdRead);t_val.tv_sec=O;t_val.tv_usec=O;Application-ProcessMess

54、ages();)if(Ret !=1)return false;if(recvfrom(gvSocket,Buffer,Size,0,(LPSOCKADDR)&SockAddr,&LenSockAddr)!=Size)return false;if(*Destino =0)(*Destino = SockAddr.sin_addr.s_addr;elseif(*Destino != SockAddr.sin_addr.s_addr) return false;memcpy(T,Buffer,Size);return true;int WriteBufferUdp(unsigned long D

55、estino,void *T,int Size)(SOCKADDRJN SockAddr;int Sent;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) return false;elsereturn tr

56、ue;void InicializaTCPIP()WORD wVersionRequested;WSADATA wsaData;IN.ADDR In;PSERVENT PServent;SOCKADDRJN SockAddrln;w VersionRequested = MAKEWORD(1,1);if(WSAStartup( wVersionRequested,&wsaData )(ShowMessageCErro na inicializao do TCP/IP);Application-Terminate();return;)/ Get the port on service filei

57、f(PServent=getservbyname(your_service_name,udp)=NULL)(ShowMessage(Erro obtendo port do servi transurb/udp);Application-Terminate();return;)gvPortUdp = PServent-s_port;sprintf(StrAux,Servi transurb/udp port:%d,ntohs(gvPortUdp);Log(StrAux);/ Open de Socketif(gvSocket = socket(AF_INET,SOCK_DGRAM,0)=INV

58、ALID_SOCKET)(ShowMessage(Erro na criao do socket);Application-Terminate();return;Log(Socket criado com sucesso);/ Do the bindSockAddrIn.sin_family 二 AF_INET;SockAddrIn.sin_port = gvPortUdp;SockAddrIn.sin_addr.s_addr = NULL;if(bind(gvSocket,(LPSOCKADDR)&SockAddrIn,sizeof(SockAddr!n)=SOCKET_ERROR) Sho

59、wMessage(Erro no bind do socket1);Application-Terminate();return;ILogCBind do socket com sucesso);判断windows的Desktop及其它目录使用 API 函数 SHGetSpecialFoldero shlobj.h 里有 SHGetSpecialFolder 的原型声明。这个函数可以帮我们找到windows的Desktop目录、启动目录、我的文档目录等。SHGetSpecialFolder需要三个参数。第一个参数是HWND,它指定了所有者窗口:在调用这个函数时可能出现的对话框或消息框。第二个参

60、数是个整数id,决定哪个冃录是待查找目录,它的取值可能是:CSIDL_BITBUCKET 回收站CSIDL_CONTROLS 控制面板CSIDL_DESKTOP Windows 桌面 desktopCSIDL_DESKTOPDIRECTORY desktop 的目录CSIDL_DRIVES我的电脑CSIDL_FONTS字体目录CSIDL_NETHOOD 网上邻居CSIDL_NETWORK 网上邻居 virtual folderCS1DL_PERSONAL 我的文档CSIDL_PR1NTERS 打印机CS1DL_PROGRAMS 程序组CSIDL_RECENT大多数最近打开的文档列一CSIDL_

61、SENDTO “发送到”菜单项CSIDL_STARTMENU任务条启动菜单项CSIDL_STARTUP 启动目录CSIDL_TEMPLATES 临时文档最后个参数是pid!地址。SHGetSpecialFolderLocation把地址写到pidL下面的代码演示了怎样使用SHGetSpecialFolderLocation:/void _fastcall TForm 1:Button 1 Click(TObject *Sender)LPITEM1DLIST pidl;LPMALLOC pShellMalloc;char szDirMAX_PATH;if(SUCCEEDED(SHGetMalloc(&pShellMalloc)(if(SUCCEEDED(SHGetSpecialFolderLocation(NULL, CSIDL_DESKTOPDIRECTORY,&pidl)(/如果成功返回trueif(SHGetPathFromIDList(pidl, szDir)(Label 1-Caption = szDir;pShellMalloc-Free(pidl)

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!