《C++Builder一些小技法1》由会员分享,可在线阅读,更多相关《C++Builder一些小技法1(122页珍藏版)》请在金锄头文库上搜索。
1、CBuilder 一些小技法怎样在 C Builder中创建使用 DLL 自从 CBuilder从去年浪漫情人节上市以来, 吸引了大量的 Delphi 、 VC 、 Vb的程序员到它的怀抱 , 大量的 C 、C程序员感叹道: 总算有了 C的可视化开 发工具,对我也是一样,从BC 、Delphi 到 CBuilder 。 动态链接库 (DLL)是 Windows编程常遇到的编程方法,下面我就介绍一下在 BCB (CBuilder下简称 BCB) 中如何创建使用DLL和一些技巧。 一、创建 : 使用 BCB File|NEW建立一个新的 DLL工程,并保存好文件BCB ,生成一个 DLL的程序框架
2、。 1DllEntryPoint函数为一个入口方法,如果使用者在DLL被系统初始化 或者注销时被调用,用来写入对DLL的初始化程序和卸载程序;参数:hinst用 来指示 DLL的基地址; reason 用来指示 DLL的调用方式,用于区别多线程单线 程对 DLL的调用、创建、卸载DLL ; 2在程序中加入自己所要创建的DLL过程、函数; 3用 dllimport描述出口; 例程序如下: include pragma hdrstop extern _declspec(dllexport) int test(); int WINAPI DllEntryPoint(HINSTANCE hinst,
3、unsigned long reason, void ) return 1; int test() return 3; 注意:动态链接库中调用过程、函数时有不同的CALL方式 _cdecl 、 _pascal, _fastcall、_stdcall,BCB 中默认的方式为 _cdecl( 可不写) ,如 果考虑兼容性可用时 _stdcall声明方法为: extern _declspec(dllexport) int _stdcall test(); 对于其中过程、函数也改为: int _stdcall test() 二、使用 DLL 在 BCB中使用 DLL有两种方法: 1用静态调用法 首先需
4、要在 BCB 的项目中加入输入接口库 (import library), 打开工程项目, 使用 BCB View|Project Manager打开项目列表,向项目中加入接口库( .lib)。 其次在头文件中加入接口声明。例程序如下: /define in include file extern _declspec(dllimport) int _cdecl test(); /use function in main program int I; I=test(); 注意:(1) 动态链接库调用过程、函数时CALL方式 与创建时方式一样不写为 _cdecl , 其它需要声明。 (2)BCB 创
5、建的 DLL有对应的输入接口库 (import library),如只有 DLL而无库 时,可用 BCB的 implib工具产生: implib xxx.lib xxx.dll;另外可用: tlib xxx.lib,xxx.lst 产生 DLL的内部函数列表,许多 Windows的未公开技术就是用 这种方法发现的。 2动态调用法 动态调用法要用 Windows API 中的 LoadLibrary()和 GetProcAddress() 来 调入 DLL库,指出库中函数位置,这种方法较常见。 例程序如下: HINSTANCE dd; int _stdcall (ddd)(void); dd=L
6、oadLibrary( 搙 xx.dll?; ddd=GetProcAddress(dd, 搕 est?; Caption=IntToStr(ddd(); FreeLibrary(dd); 三、注意: 创建 DLL时编译链接时注意设置Project Options。 Packages标签:去除 Builder with runtime packages检查框。 Linker 标签:去除 Use dynamic RTL 检查框。 否则创建的 DLL需要 Runtime packages or Runtime library。用 C+Bulider 在 WIN.INI 中保存信息现在许多软件把程序
7、中需要的数据保存在注册表中,这样当用户装的软件越 来越多时, 致使注册表越来越庞大, 容易使系统出错。 当然,微软也建议在注册 表中保存数据, 但当我们需要保存的数据不多时完全可以把数据保存在WIN.INI 中,这样可以很方便地维护,实现方法相对来说比较简单。下面我以Borland C Builder为例来说说如何实现。 原理其实很简单,只需调用API 的 WriteProfileString和 GetProfileInt 函数就可以了。这两个函数的原型是:BOOL WriteProfileString(LPCTSTR lpAppName,LPCTSTR lpKeyName,LPCTSTR l
8、pString ); UINT GetProfileInt(LPCTSTR lpAppName,LPCTSTR lpKeyName,INT nDefault); 其中 lpAppName指在 WIN.INI 中段的名字,即用 括起来的字符串, lpKeyName指在这个段中每一个项目的名字, lpString指这个项目的值,即“=” 后的数 , nDefault为当 GetProfileInt没有找到 lpAppName和 lpKeyName时返 回的值,即缺省值 , 前者返回为布尔值 (true 或 false),后者返回为无符号整形 值。当在 WriteProfileString函数中 l
9、pKeyName 为空(NULL)时,则清除这个段 的全部内容, lpString 为空时,则清除这一项目的内容,即这一行将清除掉。 下面举一例子来说明这两个函数的用法。新建一个应用程序, 在 Form1上放 两个 Edit 和三个 Button ,其中 Edit 的 Text 为空,三个 Button 的 Caption 分 别为“添加”、“查看”、“清除”。双击“添加”按钮加入下面代码: WriteProfileString(“例子程序”,“项目”,Edit1 Text.c_str(); 双击“查看”按钮加入如下代码: unsigned int Temp; Temp=GetProfileI
10、nt(“例子程序”,“项目”,100); Edit2 Text=IntToStr(Temp); 双击“清除”按钮加入如下代码: WriteProfileString( “例子程序”, NULL ,NULL) ; 然后按 F9 键运行程序。 下来可以检验一下程序的正确性。 在 Edit1 中输入数字,如“3265”, 按“添 加”按钮,这时运行“ sysedit ”来查看“ WIN.INI ”文件的最后面, 可以看到加 入了如下内容: 例子程序 项目=3265 其中“ ”和“=”是函数自动加上的。按下“查看”按钮,在Edit2 中出 现“3265”,当按下“清除”按钮可清除添加的部分。经过查看可
11、知程序已达到 预期的目的。 喜爱编程的朋友可以把上述方法应用到自己的程序中去,来达到保存数据信 息的作用。当确实要把信息保存到注册表中,可以在 C Builder中定义一个 TRegistry类的对象来进行相关的操作,或者直接调用Windows的 API 函数,具 体如何编程大家可以参阅相关资料或者同我联系。如何在 C Builder中检测硬件在我们编写的程序中常常要和硬件打交道, 那么如何在程序中确定系统中是 否有该设备 , 它的运行状态又是怎样的呢?对于初学者来说,这个问题常常不好 解决,其实只需简单地利用几个API 函数,硬件的问题并不神秘。 下面就让我们 一起看看在 C Builder
12、中是如何检测硬件的。 1. 检测 CPU 的型号 先让我们从最简单的做起, 看一看自己的 CPU 型号。首先,在 C Builder 中画出图 1 所示的窗体,在下面的几个例子中我们将一直使用这个窗体作示范, 它包括一个用来激活测试的Button 和一个用来显示结果的Memo 。我们可以用 GetSystemInfo 这个 API 获得 CPU 的型号。将下列代码添加到Button 的 Click 事件里就可以了: void _fastcall TForm1:Button1Click(TObject Sender) / 获得 CPU 型号 SYSTEM_INFO systeminfo; Get
13、SystemInfo (systeminfo); Memo1 Lines Add(撃腃 PU类型是 : 敚玈tring( systeminfo.dwProcessorType ); 运行它,点击 Test 试试, CPU 型号出来了吧! 2. 检测内存状态 获得内存状态的方法和CPU型号差不多,只是他用到的是另外一个API: GlobalMemoryStatus 。 其中,成员 dwTotalPhys 用来获得物理内存总量, 而 dwAvailPhys 顾名思义 是有效物理内存的意思。 我们只要把下面几行代码加到上面程序的后面就可以了 (不用重做,下同): / 获得内存状态 MEMORYSTA
14、TUS memory; memory.dwLength =sizeof(memory); /初始化 GlobalMemoryStatus( memory); Memo1 Lines Add(撃奈锢砟诖媸 ?Mb):敚玈tring(int(memory.dwTotalPhys /1024/1024); Memo 1Lines Add(撈渲锌捎媚诖媸 ?Kb): 敚玈 tring(int( memory. /1024); 怎么样,看出点门道了么?两段程序的格式几乎一模一样,其实, GetSystemInfoGlobalMemoryStatus还可以获得许多其他有关CPU 和内存的信 息,就按照上面
15、的格式去套就行了,更详细的资料可以去看C Builder4的 Help。 3. 检测可用硬盘空间 好了,经过前面两个简单问题的热身,我们来处理一个稍微复杂的问题:我们知 道安装程序大都有一个检测硬盘空间的过程,那么这是怎么实现的呢?他用到的 是 API 函数 GetDiskFreeSpace,这个函数输入一个参数:目标盘的路径;返回 四个参数,依次是每簇的扇区数、每扇区的字节数、空闲的簇数、总簇数。假如 我们需要检测 C盘的总容量和可用容量,那么可以把以下代码加到上面的程序 中: / 获得 C盘可用空间 DWORD sector,byte,cluster,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; /计算可用空间 Memo1 Lines Add(揅盘总空间 (Mb): 敚玈 tring(totalspace); Memo1 Lines Add(揅盘可用空间 (Mb): 敚玈 tring(frees