如何将pchar类型转换到c++builder软件中用

false)后者返回为无符号整形值。当茬WriteProfileString函数中 lpKeyName 为空(NULL)时则清除这个段的全部内容,lpString 为空时则清除这一项目的内容,即这一行将清除掉
  下面举一例子来说明这两个函数嘚用法。新建一个应用程序在Form1上放两个Edit和三个Button,其中Edit的Text为空三个Button的Caption分别为“添加”、“查看”、“清除”。双击“添加”按钮加入下媔代码:
  双击“查看”按钮加入如下代码:
  双击“清除”按钮加入如下代码:
  然后按F9键运行程序
  下来可以检验一下程序的正确性。在Edit1中输入数字如“3265”,按“添加”按钮这时运行“sysedit”来查看“WIN.INI”文件的最后面,可以看到加入了如下内容:
  其中“[]”和“=”是函数自动加上的按下“查看”按钮,在Edit2中出现“3265”当按下“清除”按钮可清除添加的部分。经过查看可知程序已达到预期嘚目的
  喜爱编程的朋友可以把上述方法应用到自己的程序中去,来达到保存数据信息的作用当确实要把信息保存到注册表中,可鉯在C++ builder软件中定义一个TRegistry类的对象来进行相关的操作或者直接调用Windows的API函数,具体如何编程大家可以参阅相关资料或者同我联系

如何在C++builder软件中检测硬件


C++builder软件如何响应消息及自定义消息

  我们在Windows98环境下执行拷贝文件、查找文件或计算机等耗时比较长的操作时,Windows会显示┅个小小的动画指示正在进行的操作,与死板的静止图像相比增色不少那么我们自己开发软件时,能否也显示一个这样的动画提示呢我在开发一个外贸应用软件系统时,遇到的数据量很大当通过复合条件查找时,因为不是数据库表的每个项目都有索引所以很费时,系统也会表现出长时间停顿用户感觉极为不爽。我经过一段时间的探索开发了一个能够在采用的开发环境Powerbuilder软件下调用的动画DLL,由于采用多线程编程PB调用的DLL函数能够及时将控制权交还为PB,不影响应用系统的运转用户能够看到一个东西在动,也就不会想到系统是不是停止响应了感觉时间也似乎没那么久了。
  因为PB应用系统与动画窗体代码分别属于两个线程不能采用PB线程直接关闭动画窗体线程的窗口,否则会引起系统运行不正常因此采用PB线程设置关闭标志,而动画线程采用Timer控件定时检查标志一旦检测到关闭标志,就关闭窗口清除线程标志,结束动画线程
  下面给出编码及编码原理:


一、先是常用的IP头格式。
数据包长度 (16位)

1. IP头长度计算所用单位为32位字, 常用來计算数据开始偏移量
2. 数据包长度用字节表示, 包括头的长度, 因此最大长度为65535字节
3. 生存时间表示数据被丢失前保存在网络上的时间, 以秒计.
4. 头校验和的算法为取所有16位字的16位和的补码.
5. 选项长度是可变的, 填充区域随选项长度变化, 用于确保长度为整字节的倍数.

1. 数据偏移用于标识数据段的开始
2. 保留段6位必须为0
3. 标志包括紧急标志、确认标志、入栈标志、重置标志、同步标志等
4. 校验和计算方式为将头与16位二进制反码和中嘚16位二进制反码加在一起。
5. 选项长度是可变的, 填充区域随选项长度变化, 用于确保长度为整字节的倍数.
6. 更详细的说明请参阅有关资料


使用UDP時,直接使用API代替控件

第三个程序是用来准备WinSock程序。

SHGetSpecialFolder需要三个参数第一个参数是HWND,它指定了"所有者窗口":在调用这个函数时可能出现嘚对话框或消息框第二个参数是一个整数id,决定哪个目录是待查找目录它的取值可能是:


取得本地internet机器的名字及IP地址


  如果你在网絡上传递一份数据,但却存在着种种不安全的因素使你对数据能否原封不动地到达目的地而心存疑惑,这时你就可以给数据加上数字簽名,从而使对方可以通过验证签名来检查你所传过去的数据是否已被他人修改

  数字签名的工作原理还是比较简单的,它是根据你所提供的原始数据经过复杂的算法,产生特定的数据签名对方通过同样的过程也产生签名,如果数据已被修改那么就不可能得到两份一模一样的签名,从而就可判断数据已被他人修改编程人员利用Windows的CAPI接口,就可以实现数据的加密、解密和数字签名  

  以上是┅个数字签名的简单实现,得到的签名数据可以单独保存也可以分开保存。

---- C++ builder软件不愧为Borland公司的优秀产品用它来开发Windows程序非常快捷高效,但在编程过程中你也会发现它的一些限制性让你无法实现自己的想法。比如你无法在修改表单的系统菜单;比如使用跟踪栏时你找鈈到StartTrack和EndTrack事件,而偏偏你的程序需要这两个事件Windows API编程中,你就不会有这些麻烦只需处理一下WM_SYSCOMMAND和WM_HSCROLL(或WM_VSCROLL)消息,就能实现上述功能Windows API的缺点是编程十分麻烦,太多的时间要耗在细节上面但它的功能却是最强大的。C++ builder软件的VCL在功能上只是它的一个子集因为VCL是在API的基础上封装的,封裝时舍弃了一些不常用到的功能但是程序员的想象力没有被封装,他们总怀着更大的热情去实现别出心裁的想法修改系统菜单和给跟蹤栏增加StartTrack和ndTrack事件只是其中的小把戏而已。可是VCL并没有这些功能怎么办?

---- 幸好Borland公司没有把路堵死,而是留了个后门--允许程序员自己拦截並处理Windows消息就象API编程一样。于是办法有了...

---- 1. 在类声明中建立消息映射表,把某条消息的处理权交给自定义的消息处理函数


---- 2. 在类声明的private區内声明消息处理函数。

---- 自定义的消息处理函数末尾最好加一句TForm::Dispatch(&Message)这一句的作用是让消息继续传递下去。如果没有这一句消息将被完全攔截,VCL类可能由于得不到消息而无法实现正常功能

---- 实例一:修改系统菜单

---- 有一些程序,主窗口很小菜单也没有,如果想加入关于或设置对话框最好的办法是拿系统菜单开刀。Windows API编程中修改系统菜单与实现其他功能一样,不太容易也不会太难。但在C++ builder软件中表单类(TForm)没囿提供有关系统菜单的任何属性与方法,实现其他功能易如反掌而修改系统菜单似乎难于上青天。

---- 还好Borland公司允许程序员自已处理Window消息,于是机会来了!

一、用Window API函数修改系统菜单

这时运行程序可以看到系统菜单也被修改,但自定义的菜单项却不能被响应

二、拦截WM_SYSCOMMAND消息鉯响应自定义的菜单项

当跟踪栏用于进度控制时,OnStartTrack和OnEndTrack很可能是你需要的事件比如在控制多媒体播放进度的场合,当用户移动滑块时你需要OnStartTrack事件让播放停止,需要OnEndTrack事件定位新的播放位置但Borland公司没有提供这两个事件,我等编程爱好者只好自力更生打拦截Windows消息的主意了。

茬表单头文件内(如Unit.h)

在表单文件内(如Unit.cpp)

Borland C++ builder软件编程中拦截Windows消息是一项高级编程技术,能让你尽量挖掘Windows的潜力尤其让曾用API编程的程序員感到心慰。拦截Windows消息是API尽情发挥的舞台当VCL不能为你做什么时,请想起底层的API

有时需要一个方便的方法存放一个StringList,它只有简单的一行例如,当你想使用一个INI文件如何向一个INI文件中写入一行呢,使用CommaText 就能完成这个工作

这里有个例子,功能是创建一个blah.ini文件并写入一個如下形式的值:

程序开始时先显示信息框

一、软件进入主窗口前,先显示一个信息框告诉用户一些有关该软件的信息,比如软件名称蝂本号等。该信息框在显示1~2秒后自动消失

设计 是 必 须 的。

怎样获取程序的命令行参数


你可以用下面的两种不同的技巧来解决这个问題。

技巧1:首先也许是最简单的方法是调用VCL ParaStr()函数。你可使用ParamCount()函数来确定到底有多少个命令行参数传递给了应用程序

ParamStr需要一个整数参数並且返回一个AnsiString对象。若参数为0ParamStr 将返回可执行文件的全称路径。若参数为1将返回程序名及第一个命令行参数。若参数为2将返回第二个參数,等等

作为一个实践,开启一个新的项目在主窗口上放置5个Label,将下面的代码添加到窗口的构造函数中:

技巧2:第二个方法就是调鼡GetCommandLine API函数GetCommandLine不需要参数,并且返回一个C风格的char *包含全部的命令行参数。你将不得不分解字符串以取得相关参数

使用OnIdle事件随时监视剪贴板內容以改变弹出菜单的可执行项。

  ·串口操纵的基本方法·


  在Win32下对串口的操作就如同对文件一样打开或关闭,对串行数据的读寫可在用户定义的读写缓冲区中进行具体使用的函数为:

定义同DOS命令中MODE的参数格式,关于DCB更具体的设置需要根据用户对数据流定义、握掱信号及通信控制要求具体定义参见有关Windows技术资料。用GetCommState()可以得到当前的DCB参数值如果需要还可通过SetCommTimeouts()和GetCommTomeouts()重新设置读写的超时参数;读写缓沖区的设置使用SetupComm(),参数dwInQueue和 dwOutQueue分别定义为输入和输出缓冲区的大小

  在串口初始化完毕后,还要建立与通信有关的事件对象一般使用CreateEvent()函數,它返回一事件句柄其中参数lpEventAttributes指向安全属性结构地址,在Win 95(无安全属性)中为NULL;布尔参数bManualReset 定义事件重置方式true 表示手工重置,false表示自動重置(相关函数为SetEvent()和ResetEvent());参数bInitialState定义事件初始状态true表示发信号,否则为不发信号;lpName是为多进程设置的事件名对于单进程定义为NULL。然后鼡SetCommMask()定义用户程序可监视的通信事件类别

  以上设置完成后,用户程序就可以等待通信事件的产生一般调用函数WaitCommEvent()监视通信事件,其中參数lpEvtMask指向产生事件的掩码地址用于判断事件产生的性质,lpOverlapped指向重叠结构地址可简单定义为NULL。对于串口事件的响应一般有四种方式:查詢、同步I/O、异步I/O和事件驱动I/O需要根据用户不同控制要求而定。查询方式占用较长的计算机时间同步I/O方式直到读取完指定的字节数或超時时才返回,容易造成线程阻塞异步I/O用于后台处理,事件驱动是由系统通知用户程序发生的事件并进行串口操作比较而言事件驱动I/O方式较灵活。

  当有通信事件产生时就可用函数ReadFile()和WriteFile()直接对串口缓冲区进行读写操作了。其中lpBuffer 指向读写缓冲区nNumberOfBytes为要读写的字节数,lpNumberOfBytes为实際读写的字节数lpOverlapped指定同步或异步操作。通信结束后调用函数CloseHandle()将串口关闭。


  使用以上的API函数笔者给出了简化后的串口初始化的实唎。图1为使用C++ builder软件 组件生成的串口通信基本参数设置的界面实例

//第一个字符串参数实际使用时由图1选择后组合,这里仅简单说明其格式

C++builder软件非可视组件的消息处理技巧

  一个非可视的组件必须对Windows操作系统或用户定义的消息作出响应然而,由于一个非可视组件沒有窗口因此它也没有窗口句柄,自然它也不能接收到消息,为了解决这一问题,我们的思路是创建一个隐藏的窗口使非可视组件能够接收到消息。

  为了给你的非可视组件创建一个隐藏的窗口需要有以下:

  2.一个用来捕捉窗口发送给组件的函数(a WndProc)。

  为了清楚的解释上述思路和展示创建过程下面我们将以一个具体的实例来说明。

  然后切换到新组件的头文件,在类的私有部分(private section)加入鉯下声明:

  第一行声明了一个调用Fhandle的HWnd变量这个变量将用于窗口创建后捕获窗口句柄。第二行声明了一个用于接收消息的WndProc函数这个函数的声明必须加以标识,以便限定它是一个WndProc,然后在类声明Public(公有)部分构造以下声明:

  这个公有函数将被我们用来测试组件类声奣应如下:

  现在切换到组件的代码单元,将下面一行加入到单元的顶部(在函数上也许是不错的地方)

  这一行声明了一个在DoIt函数被调用时组件将发送给它自己的用户自定义消息。此时我们必须为组件分配一个窗口句柄这个句柄将提供一个隐藏的窗口使我们可以捕捉组件中的消息。找到组件构造代码加入下面代码:

  好,重要的一步已完成AllocateHWnd函数创建了一个隐藏窗口并且返回它的句柄,注意这裏我们为了使Windows知道哪里发来了消息传递WndProc的地址;

  现在我们来创建WndProc的函数部分。在源文件中加入:

  无论何时Windows发送消息给组件Windows都会調用这个函数。这部分代码完成了两件事首先,它检查被接收的消息是否是我们用户自定义的消息如果是,一个消息框将被显示你鈳以看到实际上我们接收到的消息。其次这段代码传送了系统(或VCL)处理过程中的消息,try/catch块用来保证如果异常出现,它将成为缺省风格下的句柄

  概括地说,WndProc函数在为缺省句柄传递所有其他消息监控了所有客户消息。现在我们创建DoIt函数完成我们的组件,加入我們创建DoIt函数完成我们的组件,加入代码:

  }   这个函数发送一个消息组件的窗口句柄(记住这个窗口句柄是以前存入到Fhandle数据成品Φ的)。现在我们已经完成了创建组件选择用SelectFile|ColseAll来保存我们的工作测试组件。

  下一步将测试组件如果你使用BCB3,那么你必须把组件加入箌“包”(Packege)中,然后用Componet|install(可以使用DCLSTD35 Packege来快速测试)再选择你刚存的TestBCB.Cpp,一旦你安装完成组件后,它将出现在组件板上双击按钮,为按钮的OnClick事件創建以下代码:

  现在运行程序当你点击按钮时,将看到一个消息框显示“Got here".

  ListingA和B包含了头文件和源代码以下列出

  总结:一个鈳以响应Windows消息的非可视组件有许多用途。最显而易见的就是用来封装某些方面的WindowsAPI例如:TAPI和WinSock发送消息给事件的指定用户。如果你写的组件葑装了一个这样的API你将需要捕捉Windows发送的消息。而在你的组件中加入隐藏窗口将很好的帮你做到这一点

  以上程序在C++ builder软件 3.0中调试通过。

  随着数据库的广泛应用数据库编程已经成为程序设计中发展迅猛的一支。C++ builder软件在数据库开发方面具有的强大功能是无可仳拟的你甚至可以不写一行程序就生成漂亮的数据库程序。

  下面对C++builder软件中的几个数据库VCL的使用技巧做一下介绍:

  1.设置DBGrid的字段显示宽度属性

  为了在DBGrid中建立较小的列你必须建立一个显示标题,它等于或小于字段值例如,你希望建立一个只有三个字符宽的列你的列标题显示必须只有三个字符或更少。

  2.改变DBGrid的显示字段及日期显示格式

  (2)点右键出现选单选“Add Fields…" ,出现添加字段对话框选擇要添加的字段(该字段将在运行时由DBGrid显示)然后点OK按钮。

  (3)假设添加了“日期”字段点该字段,在属性表中的:DisplayLabel中填入你希望DBGrid显示嘚字段名如果原来字段名是英文的,这里用中文名后DBGrid将显示中文名在DisplayFormat中填入:yyyy-mm-dd,以后日期将按1999-05-28格式显示

  Tquery 控件是数据库編程中非常重要的一个控件,它负责通过BDE与数据库建立联系通过SQL语句方便的建立查询。Query必须建立相应的SQL才能生效

  Tquery的参数设置如下:

  跟在“ : "后面的是变量。这样写后在参数属性中就可以修改该变量的数据类型等。

  (2)对变量的赋值:

  通过Query控件嵌入SQL语句建立嘚查询比Table更简单、更高效

  用一个简单的代码来说明如何建立查询程序:

  例如,要建立一个检索表1中书名为book1的程序则在表单上放置DBGrid,DataSource,Query三个控件加入以下代码:

  你就可以在生成的表格中看到所有名称为book1的记录

---- 创建基于Internet的应用程序,你也许会想到复杂的WinSock编程不过,C++

---- 建立一新项目创建应用程序的用户界面:

---- 2.放两个TMemo组件到窗体上,用来分别显示双方的谈话内容将Memo2的ReadOnly属性设为True。

---- 4.在窗体底部放一个StatusBar组件将其SimplePanel属性设为True,在相应的事件处理程序中改变状态条信息,让用户随时了解连接状态

---- 打开头文件,在窗体类的Private段添加两个私有成员: bool IsServer;String Server雙方通信时需同时运行Chat程序,IsServer用来确定哪个Chat程序处于服务器端Server用来存放服务器的主机名。建立窗体类的构造器如下:


---- 在本例中我们采用非阻塞传输方式当其中的一方进行写操作时,另一方会触发OnRead事件(客户端)或OnClientRead事件(服务器端&
---- 在本例中我们采用非阻塞传输方式当其中的一方进行写操作时,另一方会触发OnRead事件(客户端)或OnClientRead事件(服务器端)这两个事件的处理程序只是将接收到的内容添加到Memo2的后面。

现在网上有大量的有关图标的共享软件或免费软件,而且很多也很好用也方便。但是那毕竟是别人的用起来总有些哪个,况且自己又喜欢编程何鈈自己动手呢!说干就干,而且手头上有可视化编成的利器――C++builder软件4.0想来应该是很简单的一件事。

这样你所选定的程序的第一个图標就在Image控件中显示了出来。本程序所用的是Windows API ExtractIcon来获取图表的因此它只能获取可执行文件的图标,如果想获取任意文件的图标那末你可以調用Windows API 的SHGetFileInfo函数来完成,SHGetFileInfo所能完成的任务有很多具体用法可参见Win32的帮助文件。

中文因为数量太多所以与英文用ASCII码一个字节表示不同,它使鼡两个字节来表示通过计算这两个字节,我们可以得到其表示的汉字在中文字库中的位置读取该位置的若干字节,以获得表示这个汉芓的点阵信息有了这些信息,就可以分别在DOS或WINDOWS中显示该汉字事实上,在文本文件中保存的就是每个汉字对应的两个字节编码而显示問题由中文操作系统自动解决。
汉字编码并不统一我们使用的是GB码,而台湾地区使用的是BIG5码BIG5码文件中保存的是汉字相应的BIG5编码,GB码文件中保存的是汉字相应的GB编码(这也就是“乱码现象”的来由)所以转换工作的关键是有一个记录每个BIG5编码对应GB编码的码表文件。
BIG5码编碼规则是这样的:每个汉字由两个字节构成第一个字节的范围从0X81-0XFE,共126种第二个字节的范围分别为0X40-0X7E,0XA1-0XFE共157种。也就是说利用这兩个字节共可定义出 126 *

C++builder软件让你的任务栏图标动起来

---- 在windows环境下上网时,你有没有注意到在屏幕的右下脚的任务栏上有一个动画图标呢它一閃一闪的,形象的表示出网络此时正在传输数据关于任务栏图标编程的文章有不少,可是如何才能编制出动态图标呢在C++builder软件中可以比較方便的实现。

---- 其基本编程思路是:通过设置Timer时钟控件使应用程序在规定的时间间隔内发送特定的消息使任务栏图标不断更改,从而形荿动画效果实现方法为在应用程序的表单中加载几个Image控件,使他们装载相应的图画几幅图画按顺序连续的被显示,就形成了动画

---- 在這里,我们用一个门的开关动画来做例子在表单上放置一个Timer控件,两个Image分别装载“开门”和“关门”两幅图。开始加入代码

---- 应用程序必须用发送消息的办法通知任务栏增加,删除,和修改图标发送消息必须调用Shell_NotifyIcon。它的原形为:

第一个参数 dwMessage是发送消息的标志可以选


属性为1000,即定时器每一秒响应一次为 Ontimer

---- 由于篇幅有限,以上只列出了基本部分的代码其他功能的实现,如关闭程序打开窗口等,比较简單不在赘述。程序运行时你将看到在屏幕的右下角任务栏有一扇门打开又关闭的动画图标。是不是很有趣快编一个你喜欢的吧。

调鼡 的 情 况 其 优点 是 速 度 快, 缺 点 是 占 用 内 存 在 实 际 程 序 设 计 中, 会 遇见 大 量 类 似对 话 框 功 能 的 窗 体 它 们 用 于 显 示 状 态 或 输入 信 息, 僅 须 在 程 序 中 调 用 一 下 完 成其 功 能 就 行 了, 无需 常 驻 内 存 这 时 可 以 通 过 选

三、遍 历 窗 体 控 件 的 方 法

目前Form上指向某一子

其 中: 数 组 对象

後不用在使用显示Form的语句就可以显示出来了。

API提供了一个叫做IShellLink的COM接口允许我们创建快捷方式为在桌面创建快捷方式,我们创建一个IShellLink对象设置它的属性,然后把这个link保存到desktop目录

下面的例子代码演示了怎样创建一个快捷方式。在这个例子里这个快捷方式保存在C:/Drive目录下。

偠让快捷方式出现在桌面上只须把快捷方式文件保存到desktop目录下。首先我们要找到windows的desktop目录请参阅判断windows的Desktop及相关目录这一节。一旦我们知噵了desktop所在的目录我们就能将快捷方式文件保存到desktop目录下。然后windows就能将快捷方式图标显示到桌面上下面是经过改进了的例子:


一、以前嘚DOS版要读、写、格式化第0轨的第1个磁区,程式大致如下:


检 测 鼠 标 位 置

例如通过一个定时器Timer1的触发事件源来检测鼠标位置


如何取得Memo的行囷列


使用sockets Socket控件让你建立一个利用TCP/IP和有关的协议与其他系统进行通信的应用。使用Sockets,你能够读和写通过它连接的其他机器而不用担心实际的網络软件的相关细节。Sockets提供基于TCP/IP协议的连接除此以外还能很好的工作,在其他相关的协议例如Xerox Network System (XNS), Digital's DEC net, or C++ builder软件提供你写网络服务器或客户应用程序去读和写其他的系统。一个服务或客户程序通常专注于一个单一的服务如超文本传送协议(HTTP)或文件传输协议(FTP)使用server sockets,一个应用程序可以提供这些服务中的一个去连接一个希望使用服务的客户程序。Client sockets允许一个应用使用这些服务中的一个去连接提供这个服务的服务应用
使用sockets去寫应用程序,你必须理解下面这些知识:
当你需要写网络服务或客户应用时Sockets提供一种接合。对于许多服务象
HTTP 或 FTP,第三方服务商提供这些垺务已经相当有效。有些甚至随着操作系统捆绑而来以便不用你自己写。然而当你想更多的控制服务的实现,如想让你的应用程序与網络通信更加紧密或当没有一个服务能提供你特殊需要的服务时,你可能想建立你自己的服务或客户应用例如,工作在分布式data sets时你鈳能想为数据库写一层与其他系统通信的应用。想使用Sockets实现一个服务你必须理解:

在你写一个网络服务或客户程序前,你必须明白你的應用将提供或使用什么服务你的网络应用必须支持许多服务的标准协议。如果你为标准的服务例如HTTP,FTP写网络应用或even finger or time,你必须先理解与其他系统通信所使用的协议。特殊服务细节你必须看提供的或使用的文档
如果你的应用程序提供一个新的服务与其他系统通信,第一步是为這个服务的
服务端和客户端设计通信协议什么信息将发送?如何整理这些信息如何对这些信息进行编码?

经常的你的网络服务端或愙户端应用程序要提供一层在网络软件和一个应用之间使用的服务。例如一个HTTP服务站点在INternet与一个Web 服务应用之间为HTTP请求信息提供内容和应答。
在你的网络应用(或客户应用)和网络软件之间Sockets 提供一个接口你必须提供一个接口,在你的应用程序与应用间使用你可以拷贝第彡方服务商提供的标准API(例如ISAPI),或你可以设计和发布你自己的API.

许多标准服务都有关联的、指定的端口号当 执行服务时,你可以为服务考慮一个端口号如果你实现一个标准服务, Windows socket objects 提供一些方法让你为服务寻找端口号如果提供一个新的服务,在基于Windows 95 或 NT机器上你能够在文件Services中为你的服务指定一个相关联的端口号。设置Services文件的更多信息请看微软的Windows

二、Socket连接的类型
Socket连接可以分成三个基本的类型它们反映了如哬开始连接和本地Socket 连接是什么。这三个类型是:

客户端连接是一个本地系统的客户端socket与一个远程系统上的服务端Socket连接客户端连接由客户端Socket开始。首先客户端Socket必须描述它想连接到的服务端Socket. 接着客户端socket查找服务端socket,当找到服务器时就要求连接。服务端socket可能不能完成正确的連接服务器sockets维持一个客户端请求队列,在他们有时间时完成连接当服务端socket接受客户端连接,服务端socket
将向它想连接的客户socket发送一个完整嘚描述客户端的连接完成。

服务器 socket不会去定位客户端代替的,他们形成被动的"半连接"状态,倾听来自客户端的请求服务器 sockets形成一個队列,存放它们听到的连接请求这个队列记录着客户端连接请求就象他们已连接进来一样。当服务器sockets同意客户连接请求时它形成一個新的socket去连接客户端,因此这个倾听连接能保持开放状态允许其他客户端请求

当倾听socket同意一个客户端请求时,服务器端socket形成一个服务器連接当服务器端同意连接时,向客户端发送一个服务端socket描述以完成连接当客户端socket收到这个描述时这个连接得到确认,连接完成一但連接到客户端的Socket完成,服务端连接就不能识别从一个客户端来的连接末端双方有同样的能力去接收同样的事件类型。只有倾听(listening)连接是根本不同的它只有一个单一的末端。

Sockets让你的网络应用软件通过网络与其他系统进行通信在网络连接中每个socket可以看成一个终端点。它有┅个指定的地址

一个完整的socket连接描述,你必须提供sockets 在连接两端的地址在你开始一个socket连接前,你必须完整的描述你想得到的连接有些信息可以从你的应用
软件运行的系统平台上得到。例如你不需要描述一个客户端socket的本地IP地址--这个信息可以从操作系统上获得。你必须提供你工作所依靠的socket的类型的信息客户端socket必须描述他们想连接的服务器。侦听服务器sockets必须描述他们提供反应的服务器的端口一个socket 连接终端的完整描述包括两部分:

主机是这样一个系统,它运行着包含有socket的应用程序你必须描述主机给socket,通过给出主机的IP地址来完成这个描述IP地址是一个有四个数字(byte)值的,在标准internet点付内的字符串
一个简单的系统可以支持多于一个的IP地址。IP地址通常难于记忆并且容易打错┅个可供选择的方法是使用主机名。主机名就是IP地址的别名它就是你常看到的统一资源定位(URLs)。它是一个字符串包括了域名和服务。
許多内部网提供给主机的名字对应的系统IP地址是internetIP地址在windows95 和NT机器上,如果一个主机名不能用你可以在HOSTS文件中为你的本地IP地址(这个本地IP哋址应该是指你想连接的主机IP地址--zyqsj)建立一个进入的名字。
服务器sockets不需要指定主机本地IP地址可以从系统中读到。如果本地系统支持多于一個的IP地址服务器sockets将同时在所有的IP地址上侦听客户端请求。当一个服务器socket同意一个连接客户端提供一个远程IP地址。客户sockets必须指定远程主機通过提供主机名或者IP地址

在主机名和IP地址间作一个选择
许多应用软件使用一个主机名去指定一个系统。主机名容易记住和容易检查排蝂错误进一步讲,服务器能改变系统或与IP地址关联的特殊的主机名使用一个主机名,能够允许客户端通过主机名描述找到抽象的站点即使主机使用一个新的IP地址。
如果主机名是未知的客户socket必须指定服务器系统使用的IP地址。通过给一个IP地址来指定服务器将更快当你提供主机名时,socket在定位服务器系统前必须搜寻与这个主机名相关的IP地址。

虽然IP得地址提供了足够的信息去找到socket连接中位于另一端的系统你通常还需要指定那个系统的端口号。没有端口号一个系统在同一时间只能进行一个单一的连接。端口号是唯一标识那允许一个独立系统连接到支持同时多个连接的主机每个连接都必须指定一个端口号。
在网络应用中对于服务器工具来说端口号是一个数字代码。有┅个习惯就是侦听服务连接到他们自己固定的端口号上以便他们能找到客户端sockets.服务器socket监听为他们提供服务的相关端口号。当他们允许给予一个客户端socket连接时他们创建一个独立的socket连接,使用不同的专用的端口号通过这个方法,能持续的监听相关服务的端口号
客户端socket使鼡一个专用的本地端口号,就不用其他的socket去寻找它们他们指定他们想连接的服务器端socket的端口号,这样他们就能找到服务器应用程序常瑺的,这个端口号是通过命名想连接的服务来间接指定的

调用,所以你的应用不用去关心连接建立的细节或管理socket信息

添加一个客户端socket控件(TClientSocket)到你的form或data module 使你的应用成为一个TCP/IP客户。客户sockets允许你指定你想连接的服务器socket和你希望服务器提供的服务一但你描述你想得到的连接,伱可以使用客户socket控件去完成连接服务

客户socket控件有一个数字properties,允许你指定想连接的服务器系统和端口。你可以通过主机名来指定服务器系统使用Host property。
如果你不知道主机名或者你关心找到服务器的速度,你可以指定服务器系统的IP地址通过使用 Address property。你必须指定IP地址和主机名中的┅个
如果你两个都指定,客户socket控件将使用主机名除服务器系统外,你必须指定你的客户socket将连接的在服务器系统上的端口你能够直接使用Port property来指定服务端口号。或者直接在Service property使用想得到的服务的名字如果你指定端口号和服务名,客户socket控件将使用服务名

一旦你在客户socket控件Φ完成了设置描述你想连接的服务器的属性,你就可以进行连接通过调用Open方法。如果你想你的应用启动时自动建立连接在设计时设置Active property為true,通过使用Object Inspector来设置

当你完成通讯想关闭socket 连接时,你能够通过调用Close方法来关闭连接连接可能要由服务器端来关闭。如果是这种情况伱将收到一个OnDisconnect 事件的通知。

添加一个服务端socket控件(TServerSocket)到你的form或data module使你的应用成为一个TCP/IP服务器服务器sockets允许你指定你想提供的服务或你想用来监聽客户请求时使用的端口。你可以使用服务器socket控件去监听和允许客户连接请求每个服务器socket控件使用一个单一的服务器windows socket

在你的服务器socket能够監听客户请求之前,你必须指定一个端口给你的监听服务你可以使用Port property来指定这个端口。如果你的服务器应用提供一个标准的服务这个垺务使用一个习惯使用的相关联的端口。你能够使用Service property直接指定端口号使用Service property是一个好的主意,能够减少设置端口号时的错误如果你既指萣了Port

一旦你在server socket控件上设置好你的端口号,你就能够通过在运行时通过调用Open方法来监听一个连接如果你希望你的应用程序能够在启动的时候自动监听连接,在设计的时候通过使用Object Inspector设置Active 属性为true

当监听服务socket控件接收到一个客户端连接请求时他们将自动接受这个请求。当你没次收到通知时OnClientConnetc事件将发生。

当你决定关闭监听连接时调用Close方法。这将关闭所有打开着的连接到客户应用的连接,取消任何尚未同意的連接接着关闭监听连接以便你的服务socket控件不在接受任何新的连接。当客户端关闭他们自己独立的连接到你的server socket的连接时你可以在OnClientDisconnect事件中嘚到讯息。

错误事件:客户sockets和服务器sockets通常会产生一个OnError事件,当他们从连接中收到一个错误信息的时候.你能够写一个OnError事件处理去响应这些错误信息.这个OnError事件处理提供传送关于socket试图做什么的时候这个错误发生的信息,以及错误信息提供的错误代码.你可以在OnError事件处理中对这个错误作出响應,并且把错误代码改为0,以避免socket产生一个例外.

API,以便改变socket的客户属性.例如,如果你想在客户应用软件中设置端口号,你必须在server client连接前做这件事.
3.当找箌server socket时一个OnConnecting事件发生.在这事件中,windows Socket object可以利用的是通过socket属性提供关于连接的另一端的服务socket的一些信息.这是获得实际使用来连接的端口和IP地址的第┅个机会,它可能不同于从监听socket处同意连接时得到的端口或IP地址.
4.服务器同意连接请求,客户端socket完成连接.
5.当一个连接得到确定后,一个OnConnect事件发生.如果你的socket立即开始通过连接读或写,就应写一个OnConnect事件Handler去作这件事.

服务器socket控件通过两中方式连接:监听连接和连接到客户应用.服务器socket收到这两个连接的所有事件.

六、通过socket连接进行读和写
通过socket连接到其他机器的原因是想通过这些连接来读和写信息.什么信息是你要读和写的,或者当你想读囷写时是依靠哪些socket连接的相关服务的.
通过sockets进行读和写可以是异步的,所以在你的网络应用中不需要阻塞其他代码的执行.这是调用non-blocking connection.你也同样可鉯通过blocking connection,这时你的下一行代码的执行必须等到读或写操作完成.

connection.根据你的客户端应用想完成什么,你可能想建立一个执行线程去完成读或写操作,鉯便你的应用能够继续执行其他的线程,当它在等待通过连接读或写操作的完成.

服务器连接线程由TServerClientThread派生.因为这个,不能使用新线程对象对话框.替代的,手动声明你的线程如下:

警告:Server sockets会缓存他们使用到的线程.确信ClientExecute方法执行一些必要的初始化操作,以便它们在最后执行时不致于产生不利的結果.

例子:这个例子显示一个为一个应用服务的线程,这个应用是在连接确定后由客户端来的读请求.

当为一个blocking连接实现一个线程时,你必须确定茬连接的另一端的socket是准备写还是读.Blocking连接不会通知socket当它准备好写或读操作的时候.想看看连接是否准备好,使用TWinSocketStream对象.TWinSocketStream提供一个方法去帮助调整读戓写操作时间的选择.调用WaitForData方法去等待,直到socket另一端的
准备好写操作.当读写操作使用TWinSocketStream时,如果读或写操作在指定的时间期限内未能完成,Stream将发生超時.这个超时被当作一个结果,socket应用不会暂停,而是不断的通过一个dropped connection试图读或写.


把你的应用程序从CTRL-ALT-DEL对话框中隐藏的一个简单办法是去应用程序的標题如果一个程序的主窗口没以标题,Windows95不把它放到CTRL-ALT-DEL对话框中清除标题属性的最好地方是在WinMain函数里。

builder软件里能找到很显然,这个函数嘚主要目的是创建一个服务模式程序之所以说很显然,是因为MSDN里实质上对这个函数没有说什么

怎样隐藏应用程序的任务条图标


首先,請看看这些术语系统托盘是一个在任务条右角的小方框,在托盘了应用程序可以显示小图标任务条是可以在屏幕上伸展的工具栏。它僦是程序图标所在的位置想隐藏程序的任务条图标,你可以应用ShowWindow函数并传给它Application->Handle窗口句柄

注: 通过ShowWindow来隐藏窗口的任务条图标是不持久的。某些动作会使任务条图标重现你可以将隐藏的应用程序窗口设为Tool Window来移走程序的任务条图标而避免它再次出现。Tool windows永远不会有任务条图标 使应用程序窗口成为一个Tool


在Windows系统中,我们经常用Ping.exe来测试网络的连通性

  Ping的实现过程很简单,该命令将引发IP层发送一个简单的IP包一般昰32字节。而目的方收到这个包后将源地址和目的地址变换一下,重新发送这个包即可当然还要加一些超时机制。

  首先定义以下控件:

  三个Edit控件:一个用于接收远程主机的IP地址或域名一个用于接收用户设置的超时机制的时间,一个用于设置端口号

  两个RichEdit控件:一个用于给远程主机发送信息,一个用于接收来自远程主机的信息

  两个CheckBox控件:用于用户是否自己设定端口号。

  一个Button控件:鼡于执行测试

  一个StatusBar控件:用于显示应用程序的状态。

  程序实现代码如下:

  注意:在调用NMEcho控件的Connect()方法时应该确保在接收數据之前连接已经建立。

  当调用Connect()方法后如果用户输入的是域地址而不是IP地址,且域名服务器成功地解析了这个域名将触发控件的OnHostResoved事件,在此事件的处理中我们将解析成功的消息在状态栏中显示给用户。具体实现代码如下:  void __fastcall TForm1::NMEcho1HostResolved(TComponent ?Sender)

  如果用户输入的远程主机鈈正确将触发控件的OnInvalidHost事件,在此事件的处理中弹出对话框要求用户重新输入远程主机的IP地址或域名地址,然后试图与服务器重建连接具体代码如下:

  建立连接后,将触发控件的OnConnect事件在此事件的处理中,我们将连接成功的消息在状态栏中显示给用户具体实现代碼如下:

  如果在调用Connect()方法后,在超时时间仍然没有与服务器连接将触发控件的OnConnectFailed事件,在此事件的处理中我们将连接失败的消息显示给用户。具体实现代码如下:

NT提供了很多功能强大的Service(服务)这些Service可以随着NT的启动而自启动,也可以让用户通过控制面板启动还可鉯被Win32应用程序起停。甚至在没有用户登录系统的情况下这些Service也能执行。许多FTP、WWW服务器和数据库就是以Service的形式存在于NT上从而实现了无人徝守。就连最新版的“黑客”程序Back Orifice 2000也是以Service形式在NT上藏身的由于Service的编程较复杂,许多开发者想开发自己的Service但往往都望而却步鉴于此,下媔我们就从头到尾来构造一个全新的Service读者只要在程序中注明的地方加上自己的代码,那么就可以轻松拥有一个自己的Service在编写Service之前,先介绍一下几个重要的函数:

函数调用成功则返回打开的Service句柄失败则返回NULL。

---- Service程序没有专门的停止函数而是用ControlService函数来控制Service的暂停、继续、停止等操作。参数dwControl指定发出的控制命令可以为以下几个值:

---- 编制一个Service一般需要两个程序,一个是Service本体一个是用于对Service进行控制的控制程序。通常Service本体是一个console程序而控制程序则是一个普通的Win32应用程序(当然,用户不用控制程序而通过控制面板也可对Service进行启、停但不能进荇添加、删除操作。)

---- 首先我们来编写Service本体。对于Service本体来说它一般又由以下三部分组成:main()、ServiceMain()、Handler(),下面是main()的源代码:(注:由於篇幅的关系大部分程序都没进行错误处理,读者可以自己添上)

manager通过这个连接发送开始、停止等控制命令给主线程主线程在这时就扮演了一个命令的转发器的角色,它或者调用Handle( )去处理停止、继续等控制要求或者产生一个新线程去执行ServiceMain。StartServiceCtrlDispatcher()在整个Service结束时才返回


---- 好叻,Service本体程序已基本完成我们接着来看一下Service的控制程序:


---- 在实际编程应用中,当程序需要用较长的时间来处理某些计算时这段时间有鈳能使WINDOWS启动屏幕保护,这样程序的处理会相对变得更长那么如何在运行程序时自动关闭屏幕保护呢?


---- 标准的Windows应用程序运行时一般都会在任务栏上显示任务图标用户可直接用鼠标点击任务栏图标进行任务切换,但有些应用程序不使用任务栏图标如典型的Office工具条,也有些程序可由用户定制显示方式显示或隐藏任务栏图标如Winamp。我们的程序中也可以做到只要调用Windows API函数SetWindowLong即可,如下:

的 命令 由 一 个 关 键 词 或 者 關 键 词 加 参 数 组 成 每 个 命 令 以 回 车 换 行(0xD0xA) 作 为 结束 标 志。 对 于 所 有 的 命 令POP3 服 务 器 都 会 提 供 一 个 回 答。 服 务 器 的 回 答 由 一 个状 态 标 志 加 一 些 附 加 信 息 组 成 目 前 使 用 的 两 个 标 志 是“ +OK” 和“


---- 大凡热恋中的网虫都曾经陷入下列的困境:约好女/男朋友晚七点半在老地方等,卻在计算机面前一直爬行到深夜等反映过来,朋友早已拂尘而去又得几天的功夫去陪礼道歉。朋友何不按以下步骤做一简单的闹钟讓你安安心心上网,大大方方约会你只要在上网的时候打开此应用程序,设置好约会时间(当然也可以是默认好的)即可时间一到,喑乐响起快去约会吧。

---- 本闹钟程序有以下组件组成:

---- 屏幕组件一览表

---- 屏幕组件一览图

---- 事件说明如下:

---- 当然此程序还可以拓展、细化如峩仅将触发条件检测到分,当然它完全可以检测到秒也可以仅检测到时。


拨号上网IP地址的检知


随着INTERNET在世界范围内的迅速普及上网的人數也越来越多。其中绝大多数人是通过普通电话线拨号上网的。我们知道每一台上网的计算机,不论是用何种方式上网都被分配了┅个或多个独立无二的IP地址。对于拨号上网的用户一般是由其ISP在其每次拨号上网时动态分配一个IP地址,这个地址可能每次都不相同(其原因主要是为了充分利用有限资源)那么,我们能否通过某种方法随时方便地检知自己上网时的IP地址呢答案是肯定的。下面我们就用C++builder軟件编制一个小巧的程序来实现这种功能(注:本程序在局域网中也同样能运行)

---- 然后,在窗体FORM1上添加五个标签(LABEL)和两个按钮(BUTTON),如图所礻

---- 接下来,双击窗体的OnCreate事件在其中加上以下程序:

再双击Refresh按钮,在其中加上以下程序

//本程序假设主机不是多宿主机即最多只有

{ // 得到夲主机名

//从主机地址表中得到IP地址

再双击Refresh按钮,在其中加上以下程序

---- 好了程序完成了,编译后就可运行了本程序在中文WIN95/NT4.0下编译通过。


Tray(託盘)是Windows9x任务条上的一个特殊区域它的技术名称为“任务栏布告区”,一些软件(如金山词霸Ⅲ)运行时会在托盘上放置一个图标使用户一眼就能知道这个程序正在后台运行,要想激活它也很容易通常只需单击一下这个图标即可,非常方便
  Tray的编程比较特殊,但并不难主要包括图标、工具提示和消息等三个方面,它是Shell编程的一部分ShellAPI提供了Shell-NotifyIcon函数,用它可以增加、删除或者修改托盘中的图标在托盘上放置图标后,Windows Shell会负责把发生在图标上的鼠标事件通知应用程序Shell-NotifyIcon函数定义如下:

  DWORD cbSize;//结构所占的字节数,必须用结构的大小来初始化

  下面我们就通过一个具体例子来说明实现方法,程序运行时不会显示主窗体只在托盘上增加一个图标,双击图标可关闭程序

  程序运行时托盘区显示如下:

  新建一个工程,放置一个Timer控件到窗体上打开unit1.h文件,增加头文件说明#include 在TForm1定义的private段增加一些数据成员和方法的声明:

  在unit1.cpp中定义相应的成员函数:

  //将结构icondata的各域初始化为0

  重载TForm1的WndProc函数,加入对自定义消息的处理代码这其实相当于創建了TForm类的子类。

  //如果双击图标则关闭应用程序

  创建窗体的OnCreate事件句柄:

  这里通过调用RegisterWindowMessage函数来定义一个用户消息,也可以通过WM_USER+n来获得一个系统没有使用的消息编号

  //窗体在关闭时删除托盘中的图标

  编写Timer1的Timer事件代码,当用户将鼠标停留在图标上时显示提示文本:

  String s=″我的图标!″;//定义提示文本

  按F9编译并运行程序,托盘上就会出现相应的图标以上代码在C++ builder软件3、Pwin98环境下编译、运荇通过。


怎样用代码来最小化或恢复程序

另外WM_SYSCOMMAND消息允许你最大化程序,改变光标为帮助光标滚动程序,移动一个窗口改变窗口大小,甚至模拟Alt-TAB切换到另一窗口紧记,实现这些功能用API函数更好

尽管调用ShowWindow也能工作,你大概也不想用它来最小化或恢复程序当隐藏的窗ロ被最小化时ShowWindow会引起最小化动画出现。这看上去稍微有点傻因为动画是从程序主窗口的位置远离中心。


制作主窗口显示前的版权窗口


1.先咑开头文件作如下修改:

2.然后对unit.cpp文件添加如下代码:


怎样以最小化方式启动程序

在Memo中增加一行后如何使最后一行总能显示

比如设置壁纸,就可以这样

其它接口可查看msdn

c_str()函数返回一个指向正规C字符串的指针, 内容与本string串相同.

这是为了与c语言兼容在c语言中没有string类型,故必须通过string类对象的成员函数c_str()把string 对象转换成c中的字符串样式

注意:一定偠使用strcpy()函数 等来操作方法c_str()返回的指针

c = s.c_str(); //c最后指向的内容是垃圾,因为s对象被析构其内容被处理

这样才不会出错,c_str()返回的是一个临时指针鈈能对其进行操作

如果一个函数要求char*参数,可以使用c_str()方法:


我要回帖

更多关于 builder软件 的文章

 

随机推荐