HappyLifeLife.com
HappyLifeLife.com
HappyLifeLife.com 登录 HappyLifeLife.com 注册 HappyLifeLife.com
爱新闻 爱生活
爱分享 爱学习
爱读书 爱探索
爱音乐 爱宇宙
爱电影 爱地球
爱阅读 爱世界
爱运动 爱科技
爱学习

<< < - > >>
PAS
语言技巧方法
www.HappyLiveLife.com 收藏 www.happylivelife.com
HappyLifeLife.com HappyLifeLife.com HappyLifeLife.com HappyLifeLife.com HappyLifeLife.com HappyLifeLife.com HappyLifeLife.com HappyLifeLife.com HappyLifeLife.com HappyLifeLife.com
编辑
delphi 与 C++的基本语法区别【1】“=”符号(1)“=”作为比较符。但是,当定义const常量时,“=”又表示赋值符号。而“:=”作为赋值符号。(2)“=”只表示赋值符号【2】结构体(1)record 作为结构体(2)struct 作为结构体【3】继承(1)子类名 = class(父类名)(同时注意这里的“=”也相当于赋值符号)(2)子类名:public 父类名【4】class of(1)A = class of B; 表示A是B的别名。(2)相当于typedef关键字,定义一个别名。【5】构造函数(1)构造函数名为create(2)构造函数名为类名【6】析构函数(1)析构函数名为destroy(2)析构函数名为类名加~【7】函数(1)procedure为过程,function为函数。其区别在于前者没有返回值,后者有返回值。(2)函数无返回值为void,存在返回值时同function【8】构造和析构(1)构造函数必须加constructor,析构函数必须加destructor(2)不加任何关键字【9】花括号(1)begin end代替(2)花括号{ }作用域【10】虚函数(1)virtual写在函数最后面(2)virtual写在函数最前面【11】纯虚函数(1)virtual abstract两个关键字(2)前面加virtual,后面函数直接“=0”【12】重载和覆盖(1)重载overload,override覆盖(2)参见随笔《重载覆盖重写》【13】变量声明(1)变量名在前,类型在后(2)类型在前,变量名在后【14】for循环(1)总是从0到size-1个逐个遍历(2)for(int i = 0; i < size; ++i){ }【15】函数返回值(1)有返回类型的函数,返回变量Result。无返回类型的procedure过程不考虑。(2)返回值类型与函数的返回类型必须匹配【16】静态函数(1)class function 表示静态方法(2)static关键字【17】枚举(1)type 直接枚举名,赋值为枚举成员(2)enum关键字【18】不等于(1)<>表示不等于(2)!=表示不等于【19】数组(1)arrayVar = array[1..24] of Integer;定义一个24个整型大小的数组(2)int arrayVar[24];注意下标是从0开始。【20】指针(1)type  PointerToInt = ^Integer; //指向整型的指针var  p: ^Integer; //声明一个指向整型的指针变量  x: Integer; //声明一个整型变量p:=@x; // 给指针变量赋值为整数的地址// change the value in two different waysx:=10;//改变整型变量的值p^:=20; // 改变指针指向的地址的数据值(2)int p = NULL;int a = 100;p = &a;a= 200;p = 300;【21】引用(1)procedure DoubleTheValue(var Value:Integer)begin  value := Value2;end;引用参数用var关键字标识(2)void DoubleTheValue(int & nValue){   nValue = nValue2;}备注:每项的(1)为delphi的表示;(2)为C++表示。参数可以分为: 默认参数(传值)、var(传址)、out(输出)、const(常数)四类 {默认参数是传值, 不会被改变}function MyF1(x: Integer): Integer;begin Inc(x); Result := x;end; {var参数是传址, 会被改变}function MyF2(var x: Integer): Integer;begin Inc(x); Result := x;end; {out参数是为支持Com的, 和 var 的结果是一样的, 一般我们用不着它}function MyF3(out x: Integer): Integer;begin Inc(x); Result := x;end; {const参数是绝对不可以赋值的, 这是被编译器优化的方式, 尽量多用}function MyF4(const x: Integer): Integer;begin //Inc(x); {这句会出错, 因为带 const 前缀的参数是不可以更改的} Result := x;end; //调用测试procedure TForm1.Button1Click(Sender: TObject);var a: Integer;begin a := 6; MyF1(a); ShowMessage(IntToStr(a)); //6 a := 6; MyF2(a); ShowMessage(IntToStr(a)); //7 a := 6; MyF3(a); ShowMessage(IntToStr(a)); //7 a := 6; MyF4(a); ShowMessage(IntToStr(a)); //6end;参数带有默认值的函数//带默认值的参数只能在后面function MyFun(a:Integer; b:Integer=1; c:Integer=2): Integer;begin Result := a + b + c;end;GetProcAddress(Hinstance,lpname)用来获取指定的动态连接库函数的地址 Hinstance为由LoadLibrary返回的模块句柄,lpname为文件名/函数名,返回值,成功返回动态连接库的地址,失败返回NULL, FreeLibrary(Hinstance),Hinstance为由LoadLibrary返回的模块句柄,功能是:释放动态连接库! 动态引入方式就是使用Windows的两个API即LoadLibrary和GetProcAddress,前者用于获得DLL的句柄,后者用于获得DLL 中例程的地址,这种方式之所以被称为动态的,是因为它不需要在程序的开始处把要引入的例程全部列出,只要在调用前引入,并且LoadLibrary可以指定不同的DLL,GetProcAddress可以指定不同的例程,最重要的是如果指定的DLL出错,最多是API调用失败,但不会导致程序终止,因此我们应该在程序中监视DLL的返回值,根据返回值作出相应的处理。程序示例如下: Var LibHandel:Thandlel; LibHandle:=LoadLibrary(Pchar(DLLname)); 以上首先声明一个DLL的句柄,然后用LoadLibrary获得DLL的句柄,其中DLLName是DLL的文件名,由于LoadLibrary是Windows的API,因此调用时要强制转换成Pchar类型。 Var Getcount:Function(Index:integer):Integer;StdCall; @Getcount:=GetProcAddress(LibHandle,’’GetCount’’); //很难明白,为什么前面要加@符号?以上声明了一个例程指针,指向一个函数,有一个Integer类型的参数,返回类型也是Integer,调用约定是StdCall方式,然后用GetProcAddress获得DLL中GetCount例程的地址。 Var MyCount:Integer; MyCount:=GetCount(1); 以上是调用DLL中例程GetCount的例子。 DLL只能输出例程,虽然DLL中也含有变量(全局变量),但程序不能直接引入这些变量,只能通过接口例程间接地访问这些变量。DLL也不能直接访问调用DLL的程序中的变量。 注意,不管那种方式,在编译期,编译器不检查DLL是否存在以及要引入的例程是否存在等问题,因此这类错误在编译期是检查不出来的。 进程调用 LoadLibrary(或 AfxLoadLibrary)以显式链接到 DLL。如果成功,函数将指定的 DLL 映射到调用进程的地址空间中并返回此 DLL 的句柄,该句柄可与用于显式链接的其他函数(如 GetProcAddress 和 FreeLibrary)一起使用。 LoadLibrary LoadLibrary 尝试使用用于隐式链接的同一搜索序列来定位 DLL。如果系统无法找到 DLL 或者入口点函数返回 FALSE,LoadLibrary 将返回 NULL。如果对 LoadLibrary 的调用所指定的 DLL 模块已映射到调用进程的地址空间中,则函数仅返回 DLL 的句柄并递增模块的引用数。 如果 DLL 有入口点函数,则操作系统在调用 LoadLibrary 的进程上下文中调用此函数。如果由于以前调用了 LoadLibrary 但没有相应地调用 FreeLibrary 函数而导致 DLL 已经附加到进程,则不会调用此入口点函数。 加载扩展 DLL 的 MFC 应用程序应使用 AfxLoadLibrary 而不是 LoadLibrary。AfxLoadLibrary 在调用 LoadLibrary 之前处理线程同步。AfxLoadLibrary 的接口(函数原型)与 LoadLibrary 相同。 如果出于某种原因 Windows 无法加载 DLL,进程可以尝试从错误恢复。例如,进程可通知用户所发生的错误,并让用户指定 DLL 的其他路径。 安全说明 如果代码将在 Windows NT 4 或 Windows 2000 上运行,请务必要指定任何 DLL 的完整路径名。Delphi中TApplication详解   TApplication是用于Delphi应用程序的类型,该类在单元forms中声明。TApplication是Delphi构造 Windows应用程序所需的类型,其方法和属性集中包括了Windows操作系统中创建、运行和销毁应用程序等既定的基本操作和属性,因此在用Delphi编写 Windows应用程序时简化了用户和Windows环境之间的接口。TApplication封装了以下功能:1、Windows消息处理。2、上下文联机帮助。3、菜单加速和键盘处理。4、异常处理。5、管理由Windows操作系统为应用程序定义的基本部分,如主窗口、窗口类等。  每个Delphi应用程序自动声明一个 Application变量作为应用程序的实例。如果Delphi应用程序不是一个Web服务器应用程序,那么该变量一定是TApplication类型。因此TApplication不需要出现在组件选择板(component palette)中,并在窗体设计器(form designer)中也不能对其进行可视化操作,故TApplication不具有发布属性(published properties)。不过,TApplication的公共属性(public properites)在设计时(design-time)是可以设置或修改的,如在Project|Options对话框的Forms和Application页面中。  下面就向大家介绍TApplication中的大部分属性、方法和事件。1、属性Active指明了应用程序是否处于活动状态且拥有焦点。定义如下:  property Active: Boolean;  Active是只读属性。当应用程序是活动状态时Active为True,否则为False。TApplication的构造器(constructor) 置Active为True。如果窗口或应用程序拥有焦点,那么该应用程序是活动的。当其它应用程序的窗口成为活的时,当前应用程序即为非活动的。应用程序关闭时TApplication的析构器(destructor) 置Active为False。  在应用程序中,可以用一个计时器(TTimer)来检查属性Active的值,从而确定当前的应用程序是否是活动状态,以便作出相应的处理。也可以在事件OnActive和事件OnDeactive中定义指定的操作。2、属性DialogHandle  属性DialogHandle提供使Delphi应用程序使用非Delphi对话框的一种机制。定义如下:  property DialogHandle: HWnd;  当使用API函数CreateDialog创建一个非模式化对话框时需要使用 DialogHandle,并且需要查看应用程序消息循环中的消息以进行相应的操作。比如,当一个非模式化对话框收到一条激活消息(WM_NCACTIVATE)时可以将其句柄赋值到 DialogHandle,当对话框收到一条解除激活消息时置DialogHandle为0。3、属性ExeName  属性ExeName包含了可执行的应用程序文件名极其路径信息。定义如下:  property ExeName: string;  ExeName是只读属性。使用ExeName能够得到应用程序可执行文件的文件名。   这是一个很有用的属性。例如,运行光盘中的应用程序 f:\media\myapp.exe 时,可能需要访问目录 f:\media\data\ 中的文件或者确定应用程序所在的驱动器盘符。 这时可以使用Delphi提供的函数ExtractFilePath和ExtractFileName对属性ExeName 进行解析,从而得到需要的信息。4、属性Handle  属性Handle提供了对应用程序主窗口句柄的访问。定义如下:  property Handle: HWND;当调用一个需要父窗口句柄的Windows API函数时需要使用Handle属性。例如,应用程序中某个动态链接库(DLL) 可能需要父窗口句柄以使得其自身能够弹出并且显示在最前端。使用Application.Handle构成应用程序的若干窗口,使得这些窗口在应用程序中能够被最小化、恢复、有效或无效。注意:编写一个使用 VCL窗体的动态链接库时,应将主运行程序中主窗口的句柄赋值到该动态链接库的Application.Handle属性。这样就使得动态链接库的窗体成为主应用程序的一部分。需要特别指出的是,永远不要在EXE应用程序中给Application.Handle赋值。5、属性HelpFile  属性HelpFile指明了应用程序用于显示帮助内容的文件名。定义如下:  property HelpFile: string;使用HelpFile是为了应用程序拥有一个使用标准Windows帮助系统的帮助文件。Windows显示由HelpFile属性指明的帮助文件。要让应用程序实现这一点,必须在运行时为HelpFile属性赋予一个文件名的值,或者在设计时Project|Options对话框的Application页面中指定一个帮助文件。默认情况下,HelpFile是一个空串(''),并且应用程序的帮助方法忽略所有的试图显示帮助。如果HelpFile包括任何内容,帮助主题的方法将根据文件名调出 Windows帮助系统以提供联机帮助。  注意:如果活动窗口的帮助文件已指定,则该文件将优先于应用程序的帮助文件显示。6、属性Hint  属性Hint指明了出现在帮助提示框(Help Hint box)中的文本字符串。定义如下:  property Hint: string;TApplication.Hint属性就是鼠标正在移动经过的控件或菜单项的 Hint值。该属性也能被赋予一个向用户提供动作、错误或其它信息的字符串值。使用Hint属性也能够从控件传递提示信息到另一显示区,例如通过OnHint事件句柄将提示显示到状态栏中。这时是读取Hint属性。当应用程序正在进行某一动作时简要描述其状态。这时是设置Hint属性。当OnHint事件发生时帮助提示才出现。因此,即使TApplication的Hint属性被赋予状态栏的标题,例如状态栏控件的标题显示Hint属性的当前字符串值,也应归于OnHint事件。  Hint字符串包括两部分:短提示和长提示。短提示用于简洁的弹出提示;长提示与短提示之间用竖线"|"隔开,用于在状态栏中显示较详细的提示信息。可以使用单元 Controls中提供的字符串函数GetShortHint和GetLongHint从Hint属性中分解得到短提示和长提示。  注意:当应用程序通过设置Hint属性向用户提供某一事件发生的信息时应当切记,默认情况下,当鼠标移动经过某一控件时,Hint字符串被复位到该控件的Hint属性值。7、属性HintHidePause  属性HintHidePause 指定了鼠标尚未从控件或菜单项上移开、在隐藏帮助提示之前的时间间隔。定义如下:  property HintHidePause: Integer;  用HintHidePause以毫秒为单位指定等待时间,在TApplication 的构造器中该属性被置为2500毫秒(2.5秒)。控件或菜单项的帮助提示在Hint属性中指定。  注意:默认应将HintHidePause的值预先确定为HintPause属性值的3到5倍较合适。8、属性MainForm  属性MainForm唯一标识了应用程序的主窗体。定义如下:  property MainForm: TForm;  属性MainForm指定的窗体不一定等同于应用程序的主窗口。属性MainForm的值一定是由方法CreateForm创建的所有窗体中的第一个窗体,但该窗体未必是应用程序的主窗口。新建一个工程时,MainForm属性值自动置为Form1。在设计时可通过Project|Options对话框中的Forms页面在多个窗体中指定其中之一为MainForm。  在运行时是不能修改MainForm属性的,因为该属性是只读的。主窗体是应用程序主题创建的第一个窗体。主窗体关闭即应用程序终止。  在应用程序中,可以调用方法Application.MainForm.Close来终止应用程序运行,可以获取Application.MainForm.Top、Application.MainForm.Left 等属性的值从而确定当前活动窗口的位置以及尺寸等。9、属性ShowMainForm  属性ShowMainForm确定了是否在应用程序启动时显示主窗体。定义如下:  property ShowMainForm: Boolean;  应用程序用ShowMainForm属性控制是否以及何时显示其主窗体。  TApplication的构造器置ShowMainForm为True。默认情况下主窗体将被显示,MainForm属性中指明了主窗体。  如果需要在应用程序启动时隐藏主窗体,那么应在主工程文件中调用 Application.Run之前置ShowMainForm为False,并且确信主窗体的Visible属性值为False。这在许多实现OLE自动化服务器是很有用的,比如在启动自动化服务时隐藏服务器程序的主窗体。  另外,如果需要在应用程序启动时显示一个闪出图片(Flash) 并为应用程序的环境做一些准备,同时需要禁止主窗体显示,这也可以利用属性ShowMainForm来实现。比如Delphi启动时就禁止了主窗体的显示。10、属性Terminated  属性Terminated报告应用程序是否收到终止程序的Windows消息WM_QUIT。定义如下:  property Terminated: Boolean;Terminated是只读属性。该属性主要用于调用ProcessMessages 方法时应用程序不必在停止后试图处理Windows 消息。当ProcessMessages方法收到消息WM_QUIT时,Terminated将被置为True。  Delphi应用程序总会因为主窗体或应用程序关闭,或者因为Terminate 方法被调用而收到消息WM_QUIT。  当应用程序执行强度较大、占用系统资源较多的运算时,应当周期性地调用Application.ProcessMessages方法,并检查属性Application.Terminated以确定是否需要终止运算从而终止应用程序。11、属性UpdateFormatSettings  属性UpdateFormatSettings指明了当用户改变系统配置时应用程序是否自动更新格式设置。定义如下:  property UpdateFormatSettings: Boolean;  UpdateFormatSettings属性指明系统中提示窗口字体和图标标题等设置改变是否反映到应用程序中相关设置的改变。TApplication的构造器置UpdateMetricSettings的初始值为True。使用UpdateFormatSettings属性应用程序可以控制自动更新格式设置。TApplication的构造器置该属性为True。当应用程序收到消息WM_WININICHANGE时将检查UpdateFormatSett-ings属性。建议使用默认的格式设置,也就是Windows本地的设置。可以置UpdateFormatSe-ttings为False以避免在Delphi应用程序执行期间改变格式设置。12、方法BringToFront  方法BringToFront设置应用程序中最近一次的活动窗口到桌面上所有窗口的最前端。其定义如下:  procedure BringToFront;  用BringToFront方法可以找到属于主窗体的最近一次的活动窗口并且将其置于最前端。BringToFront方法也可以测试和查看一个窗口在成为最前端窗口之前是否是可见 (Visible) 和有效的(Enabled) 。  例如,当应用程序收到邮件时,可能需要将专门的处理程序激活并置于Windows 桌面的最前端。这时就可以调用Application.BringToFront方法来实现。13、方法CreateForm  方法CreateForm方法用于创建新的窗体(form)。定义如下:  procedure CreateForm(FormClass: TFormClass; var Reference);  Delphi应用程序总会调用CreateForm方法。因此程序员很少有必要直接调用CreateForm方法。一个典型的Delphi工程在工程的主体代码部分包括一处或多处调用CreateForm方法,并且在使用窗体设计器时自动控制窗体的创建。也可以在运行时可以调用CreateForm方法来动态创建窗体。  CreateForm方法根据FormClass 参数创建一个新的指定的窗体并且将窗体赋予到变量参数Reference。 新创建的窗体的所有者就是对象Application。 应用程序将第一个调用CreateForm 创建的窗体默认为工程的主窗体。14、方法HandleException  方法HandleException为应用程序的异常提供默认的句柄。定义如下:  procedure HandleException(Sender: TObject);  方法HandleException 对于编写特定组件的作者来说是很有用的,因为它可以产生一个不必对Windows 消息产生响应的事件。在应用程序中可以利用OnException 事件句柄将其它的异常操作控制在自定义的代码中。  在应用程序代码中,如果异常跳过了所有的try 块,那么应用程序将自动调用HandleException方法,并将显示一个提示有错误发生的对话框。除非异常对象是EAbort,此时HandleException将调用OnException句柄(如果存在),否则将调用ShowException显示一个提示有错误发生的对话框。15、方法UnhookMainWindow  UnhookMainWindow方法用于释放由HookMainWindow方法挂在主窗体的程序。定义如下:  type TWindowHook = function(var Message: TMessage): Boolean of object;  procedure UnhookMainWindow(Hook: TWindowHook);  用UnhookMainWindow可以释放挂钩窗口。在参数Hook中指明对话框过程。  TwindowHook 类型是调用HookMainWindow方法的参数。该参数是非Delphi对话框中调用对话程序的方法指针。对话程序与窗口程序相似,都是为对话框处理消息,只是语法不同。16、事件OnActivate  当应用程序成为活动状态时OnActivate事件发生。定义如下:  type TNotifyEvent = procedure (Sender: TObject) of object;  property OnActivate: TNotifyEvent;  用OnActive事件编写一个事件句柄来完成当应用程序成为活动状态时指定特别的处理。  当一个Windows 应用程序最初运行时或其焦点从另一个Windows 应用程序转移回到当前应用程序时,该应用程序成为活动状态。17、事件OnDeactivate  当应用程序成为非活动状态时OnDeactivate事件发生。定义如下:  type TNotifyEvent = procedure (Sender: TObject) of object;  property OnDeactivate: TNotifyEvent;  在应用程序成为非活动状态之前可以立即触发OnDeactive事件,从而完成在该事件句柄中指定的特别处理。当用户从当前应用程序转换到另一应用程序时,当前应用程序的OnDeactive事件即发生。18、事件OnException  当应用程序中的某个无句柄的异常发生时事件OnException发生。定义如下:   type TExceptionEvent = procedure (Sender: TObject; E: Exception) of object;  property OnException: TExceptionEvent;  可以通过OnException 事件来改变在应用程序中无句柄的异常发生时的默认动作。在方法TApplication.HandleException方法中,OnException 事件句柄被自动调用。  OnException 事件仅用于处理在进行消息处理时发生的异常。在Application.Run 执行前或执行后发生的异常不会导致OnException事件发生。  如果某个异常在应用程序代码的try 块中被忽略,那么应用程序将自动调用HandleException方法。除非异常对象是EAbort,此时HandleException 将调用OnException句柄(如果存在), 否则将调用ShowException 显示一个提示有错误发生的对话框。  TExceptionEvent类型是OnException事件的类型,该类型在应用程序中指向一个处理异常的方法。参数Sender是引发异常的对象,而参数E 是异常对象。19、事件OnHelp  当应用程序收到帮助请求时OnHelp事件发生。定义如下:  type THelpEvent = function (Command: Word; Data: Longint; var CallHelp: Boolean): Boolean of object;  property OnHelp: THelpEvent;  用OnHelp编写一个事件句柄以完成有请求帮助时特别的处理。HelpContext方法和HelpJump方法自动引发OnHelp事件。  在事件发生之后置CallHelp为True使VCL调用WinHelp;置CallHelp为False以防止VCL调用WinHelp。 Delphi应用程序中所有与帮助有关的方法都经过OnHelp事件。仅当OnHelp事件中的CallHelp参数返回True或OnHelp事件没有被指定到有效的句柄时,WinHelp被调用。20、事件OnHint  当鼠标指针移动经过某个控件或菜单项并且该控件或菜单项能够显示帮助提示时,事件OnHint发生。定义如下:  type TNotifyEvent = procedure (Sender: TObject) of object;  property OnHint: TNotifyEvent;  用OnHint编写的事件句柄能够在OnHint事件发生时执行指定的操作。当用户停放鼠标指针在某个控件上,并且该控件的Hint属性值不是空串(''),这时OnHint事件将发生。  通常用OnHint事件显示控件或菜单项Hint属性的值作为某个面板控件(如TStatusBar)的标题,因此把面板(panel) 用作状态栏(status bar)。当OnHint事件发生时,Hint属性通常被指定为一个帮助提示(Help Hint)和一个在别处显示的长提示(longer hint)。 21、事件OnIdle  当应用程序成为空闲状态时OnIdle事件发生。定义如下:  type TIdleEvent = procedure (Sender: TObject; var Done: Boolean) of object;  property OnIdle: TIdleEvent  用OnIdel编写一个事件句柄当应用程序空闲时完成指定的操作。当应用程序不执行任何代码时即为空闲的。例如,当应用程序等待用户输入时该应用程序是空闲的。  TIdelEvent类型是OnIdel事件的类型,它指向一个当应用程序空闲时运行的方法。对象TIdelEvent有一个默认为True的布而变量Done。当Done为True时,Windows API 函数WaitMessage将在OnIdel返回时被调用。WaitMessage 使其它应用程序得到控制焦点直到应用程序的消息队列中出现一条新的消息。当参数Done为False 且应用程序不忙时,应用程序不会使其它应用程序得到控制焦点。  当应用程序转为空闲状态时,OnIdel事件仅发生一次,直到参数Done置为True才可能发生下一次OnIdel事件。应用程序置Done为False消除了紊乱的CPU时间计数,而该计数可能影响整个系统的性能。22、OnMessage  当应用程序接收到Windows消息时事件OnMessage触发,定义如下:  type TMessageEvent = procedure (var Msg: TMsg; var Handled: Boolean) of Object;  preperty OnMessage: TMessageEvent  用于接收Windows消息,该事件能接收程序向Windows发送的所有消息。应用程序接收到一个消息时触发该事件。变量Msg是Windows消息类型。Delphi判断文件是否正在被使用(CreateFile也可以只是为了读取数据,而不是创建)首先,我们先来认识下CreateFile函数,它的原型如下 HANDLE CreateFile( LPCTSTR lpFileName, //指向文件名的指针 DWORD dwDesiredAccess, //访问模式(写/读) DWORD dwShareMode, //共享模式 LPSECURITY_ATTRIBUTES lpSecurityAttributes,//指向安全属性的指针 DWORD dwCreationDisposition, //如何创建 DWORD dwFlagsAndAttributes, //文件属性 HANDLE hTemplateFile //用于复制文件句柄); 下面是参数的说明 lpFileName 指向一个空结尾字符串。该参数指定了用于创建或打开句柄的对象。 如果lpFileName的对象是一个路径,则有一个最大字符数的限制。不能超过常量(MAX_PATH).这个限制指示了CreateFile函数如何解析路径. dwDesiredAccess 指定对象的访问方式,程序可以获得读访问权,写访问权,读写访问权或者是询问设备("device query") 访问权. 这个参数可以是下列值的任意组合 0 指定询问访问权.程序可以在不直接访问设备的情况下查询设备的属性. GENERIC_READ 指定读访问权.可以从文件中读取数据,并且移动文件指针.可以和GENERIC_WRITE组合成为"读写访问权". GENERIC_WRITE 指定写访问权.可以从文件中写入数据,并且移动文件指针.可以和GENERIC_READ组合成为"读写访问权". dwShareMode 设置位标志指明对象如何共享.如果参数是0, 对象不能够共享. 后续的打开对象的操作将会失败,直到该对象的句柄关闭. 使用一个或多个下列值的组合来共享一个对象. FILE_SHARE_DELETE WINDOWS NT:后续的仅仅请求删除访问权的打开操作将会成功. FILE_SHARE_READ 后续的仅仅请求读访问权的打开操作将会成功. FILE_SHARE_WRITE 后续的仅仅请求写访问权的打开操作将会成功. lpSecurityAttributes 指向一个 SECURITY_ATTRIBUTES 结构的指针用于确定如何在子进程中继承这个句柄.如果这个参数是NULL,则该句柄不可继承.dwCreationDisposition 指定当文件存在或者不存在时如何动作。关于这个参数更多的信息,参考批注部分。这个参数必须是一个或多个下列值。 CREATE_NEW 创建一个新文件. 如果该文件已经存在函数则会失败. CREATE_ALWAYS 创建一个新文件.如果该文件已经存在,函数将覆盖已存在的文件并清除已存在的文件属性 OPEN_EXISTING 打开一个文件,如果文件不存在函数将会失败. 如查你使用CreateFile函数为设备装载控制台.请查看批注中的"为什么使用OPEN_EXISTING标志"的部分. OPEN_ALWAYS 如果文件存在,打开文件. 如果文件不存在,并且参数中有CREATE_NEW标志,则创建文件. TRUNCATE_EXISTING 打开一个文件,每次打开,文件将被截至0字节.调用进程必须用GENERIC_WRITE访问模式打 开文件.如果文件不存在则函数就会失败. dwFlagsAndatributes 为文件指定属性和标志位 该参数可以接收下列属性的任意组合.除非其它所有的文件属性忽略FILE_ATTRIBUTE_NORMAL. FILE_ATTRIBUTE_ARCHIVE 文件将被存档,程序使用此属性来标志文件去备份或移除 FILE_ATTRIBUTE_HIDDEN 文件被隐藏,它不会在一般文件夹列表中被装载. FILE_ATTRIBUTE_NORMAL 文件没有被设置任何属性. FILE_ATTRIBUTE_OFFLINE 文件的数据没有被立即用到。指出正在脱机使用该文件。 FILE_ATTRIBUTE_READONLY 这个文件只可读取.程序可以读文件,但不可以在上面写入内容,也不可删除. FILE_ATTRIBUTE_SYSTEM 文件是系统的一部分,或是系统专用的. FILE_ATTRIBUTE_TEMPORARY 文件被使用后,文件系统将努力为(文件的)所有数据的迅迅访问保持一块 内存。临时文件应当在程序不用时及时删除。 dwFlagAndAttributes可以接受下列标志的任意组合。 FILE_FLAG_WRITE_THROUGH 指示系统通过快速缓存直接写入磁盘. FILE_FLAG_OVERLAPPED 指示系统初始化对象, 此操作将对进程设置一个引用计数并返回ERROR_IO_PENDING.处理完成后, 指定对象将被设置为信号状态.当你指定FILE_FLAG_OVERLAPPED时,读写文件的函数必须指定一个OVERLAPPED结构.并且. 当FILE_FLAG_OVERLAPPED被指定, 程序必须执行重叠参数(指向OVERLAPPED结构)去进行文件的读写.这个标志也可以有超过一个操作去执行. FILE_FLAG_NO_BUFFERING 指示系统不使用快速缓冲区或缓存,当和FILE_FLAG_OVERLAPPED组合,该标志给出最大的异步操作量, 因为I/O不依赖内存管理器的异步操作.然而,一些I/O操作将会运行得长一些,因为数据没有控制在缓存中.当使用FILE_FLAG_NO_BUFFERING打开文件进行工作时,程序必须达到下列要求: 文件的存取开头的字节偏移量必须是扇区尺寸的整倍数. 文件存取的字节数必须是扇区尺寸的整倍数.例如,如果扇区尺寸是512字节程序就可以读或者写512,1024或者2048字节,但不能够是335,981或者7171字节. 进行读和写操作的地址必须在扇区的对齐位置,在内存中对齐的地址是扇区尺寸的整倍数. 一个将缓冲区与扇区尺寸对齐的途径是使用VirtualAlloc函数. 它分配与操作系统内存页大小的整倍数对齐的内存地址.因为内存页尺寸和扇区尺寸--2都是它们的幂. 这块内存在地址中同样与扇区尺寸大小的整倍数对齐. 程序可以通过调用GetDiskFreeSpace来确定扇区的尺寸. FILE_FLAG_RANDOM_ACCESS 指定文件是随机访问,这个标志可以使系统优化文件的缓冲. FILE_FLAG_SEQUENTIAL_SCAN 指定文件将从头到尾连续地访问.这个标志可以提示系统优化文件缓冲. 如果程序在随机访问文件中移动文件指针,优化可能不会发生;然而,正确的操作仍然可以得到保证 指定这个标志可以提高程序以顺序访问模式读取大文件的性能, 性能的提高在许多程序读取一些大的顺序文件时是异常明显的.但是可能会有小范围的字节遗漏. FILE_FLAG_DELETE_ON_CLOSE 指示系统在文件所有打开的句柄关闭后立即删除文件.不只有你可以指定FILE_FLAG_DELETE_ON_CLOSE如果没有使用FILE_SHARE_DELETE,后续的打开文件的请求将会失败. FILE_FLAG_BACKUP_SEMANTICS WINDOWS NT:指示系统为文件的打开或创建执行一个备份或恢复操作. 系统保证调用进程忽略文件的安全选项,倘若它必须有一个特权.则相关的特权则是SE_BACKUP_NAME和SE_RESTORE_NAME. 你也可以使用这个标志获得一个文件夹的句柄,一个文件夹句柄能够象一个文件句柄一样传给某些Win32函数。 FILE_FLAG_POSIX_SEMANTICS 指明文件符合POSIX标准.这是在MS-DOS与16位Windows下的标准. FILE_FLAG_OPEN_REPARSE_POINT 指定这个标志制约NTFS分区指针.该标志不能够和CREAT_ALWAYS一起使用. FILE_FLAG_OPEN_NO_RECALL 指明需要文件数据,但是将继续从远程存储器中接收.它不会将数据存放在本地存储器中. 这个标志由远程存储系统或等级存储管理器系统使用. hTemplateFile 为GENERIC_READ访问的模式指定一个句柄到模板文件.模板文件在文件开始创建后提供文件属性和扩展属性. Return Values 返回值 如果函数成功,返回一个打开的指定文件的句柄.如果指定文件在函数调用前已经存在并且dwCreation参数是CREATE_ALWAYS 或者OPEN_ALWAYS,调用GetLastError就会返回ERROR_ALREADY_EXISTS(表示函数成功). 如果函数文件在调用前不存在则会返回0. 如果函数失败,返会值会是INVALID_HANDLE_VALUE. 更多的错误信息可以调用GetLastError来获得. 看下面的这个 “判断文件是否正在被使用”的函数更容易理解一些,函数如下: function IsFileInUse(fName :string) : boolean;var HFileRes : HFILE; begin Result := false; //返回值为假(即文件不被使用) if not FileExists(fName) then exit; //如果文件不存在则退出 HFileRes := CreateFile(pchar(fName), GENERIC_READ or GENERIC_WRITE, 0 {this is the trick!}, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); Result := (HFileRes = INVALID_HANDLE_VALUE); //如果CreateFile返回失败 那么Result为真(即文件正在被使用) if not Resultthen //如果CreateFile函数返回是成功 CloseHandle(HFileRes); //那么关闭句柄end; 函数的调用方法:IsFileInUse(要判断的文件路径); 如果函数返回True 则正在使用,False则文件现在没被使用 参考:http://blog.csdn.net/sforiz/article/details/6918719------------------------------------------------------------------------------#include #include #include int main(){ std::wstring originalStrFile(L"./test.txt");HANDLE hFile; hFile = CreateFile(originalStrFile.c_str(), // file to open GENERIC_READ, // open for reading FILE_SHARE_READ, // share for reading NULL, // default security OPEN_EXISTING, // existing file only FILE_ATTRIBUTE_NORMAL, // normal file NULL);//获取文件大小DWORD dwSize =GetFileSize(hFile,NULL);//获取文件类型DWORD fileType=GetFileType(hFile);//获取文件时间信息FILETIME time1;FILETIME time2;FILETIME time3;GetFileTime(hFile,&time1,&time2,&time3);//获取文件名DWORD bufferLength=100;TCHAR buffer[100]=TEXT(""); TCHAR lpPart[100]={NULL};//获取全名GetFullPathName(originalStrFile.c_str(),bufferLength,buffer,lpPart);//获取长路径名GetLongPathName(originalStrFile.c_str(),buffer,bufferLength);//获取短路径名GetShortPathName(originalStrFile.c_str(),buffer,bufferLength);//关闭句柄对象CloseHandle(hFile);}Delphi 消息之拦截篇---拦截系统关机、重启、注销  最近做的项目中需要拦截系统关机,因为我在FormCloseQuery中总是把CanClose设为False,不拦截关机的话直接导致系统中的关机、重启、注销都失效了!导致用户不能关机!(提示用户说要关机的话直接按电源^^)这样肯定是不行的!要完成这个功能只需要拦截到WM_QUERYENDSESSION消息就万事Ok!  Windows在关机的时候会想(向)所有顶层窗口广播一个消息WM_QUERYENDSESSION,其lParam参数可以区分是关机还是注销用户(注销用 户时lParam是ENDSESSION_LOGOFF)。然后Windows会等到所有的应用程序都对这个消息返回TRUE才会关机,因此,只要我们的 应用程序对这个消息的处理返回FALSE,Windows就不会关机了。  这个消息不能直接让应用程序退出,这个消息主要是询问应用程序是否已经作好了退出的准备,当所有的应用程序都对这个消息返回TRUE,系统回(会)注销或关机。如果想退出程序,请使用WM_CLOSE消息!关键在于怎么在Delphi下拦截WM_QUERYENDSESSION消息呢?Delphi也是很强悍的,当然不用直接去SetWindowLong了。  首先介绍一下Delphi中拦截消息的几种做法第一种:自定义处理单条消息 unit Unit2; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs; type TForm2 = class(TForm) procedure FormCreate(Sender: TObject); procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean); private { Private declarations } //直接用 TWMQueryEndSession procedure EndMsg(var nMsg: TWMQueryEndSession); Message WM_QUERYENDSESSION; //也可以用这种 //procedure EndMsg(var nMsg: TMessage); Message WM_QUERYENDSESSION; public { Public declarations } end; var Form2: TForm2; implementation {$R .dfm} //收到WM_QUERYENDSESSION消息后就会触发这个过程 procedure TForm2.EndMsg(var nMsg: TWMQueryEndSession); begin //0 可以取消关机操作 nMsg.Result := 1; ShowMessage('注销、重启、关机'); end; end. 第二种:利用Application.OnMessage处理消息view plainunit Unit2; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs; type TForm2 = class(TForm) procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } procedure OnMsg(var nMsg: tagMSG; var nHandled: Boolean); end; var Form2: TForm2; implementation {$R .dfm} //消息处理过程 procedure TForm2.OnMsg(var nMsg: tagMSG; var nHandled: Boolean); begin //处理…… //这里会收到各种消息……经测试无法收到WM_QUERYENDSESSION消息 end; procedure TForm2.FormCreate(Sender: TObject); begin Application.OnMessage := OnMsg; end; end. 第三种:自己处理窗口函数,个人感觉这是最强大的,可以拦截一切发往窗口的消息!view plainunit Unit2; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs; type TForm2 = class(TForm) procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } procedure WndProc(var nMsg: TMessage); override; end; var Form2: TForm2; implementation {$R .dfm} procedure TForm2.WndProc(var nMsg: TMessage); begin //这里能收到发往窗口的所有消息 inherited; // 注意这句不能少 if nMsg.Msg = WM_QUERYENDSESSION then begin if nMsg.LParam = 0 then ShowMessage('关机或重启') else ShowMessage('注销'); end; end; end. 经过再次测试,只有Application.OnMessage不能拦截WM_QUERYENDSESSION消息!还有,有时候Delphi的一些控件也会导致不能正确拦截。delphi中nil的用法和C++中的NULL一样的意思,指空值,它和0值不一样~~ nil就是空指针如何在delphi中操作文件的读与写? 我刚开始接触delphi,如何在delphi中操作文件的读与写,哪位朋友指教一下非常感谢!最好来段源码. var f:text;... AssignFile(f,'c:/1.txt'); ReWrite(f); Writeln(f,'This is a test'); CloseFile(f);... 其中Rewrite是新建文件,若换成Reset则为打开文件 Writeln为行写入并换行,Write为写入不换行,Readln为读一行并换行,Read为读但不换行 delphi 读写文件方法有很多种:我送你一贴:程序设计当中我们时常遇到需要处理文件、目录及驱动器的情况,本章将对如何处理不同类型的文件进行讲述。本章包括如何使用T F i l e S t r e a m 类封装文件的输入/输出以及如何利用3 2 位Wi n d o w s 的主要特征—内存映射文件。你将学习到如何创建一个封装了内存映射文件功能的T M e m o r y M a p p e d F i l e类,并用它在文本文件中进行文本查询。本章还提供了一些关于选择驱动器、在树型目录中查询文件及获取文件版本信息的方法。本章将使你对文件、目录及驱动器有深入的认识。处理文件的输入/输出你将要对三种文件进行处理:文本文件、类型文件和二进制文件。以下几节是关于文件输入/输出的讲解。文本文件指可被任意文本编辑器读取的A S C I I 文本。类型文件指包含由程序员定义的数据类型的文件。二进制文件包含了其他所有的类型,它是对包含任意格式或无格式数据的文件的统称。文本文件的处理本节讲述使用内建于Object Pascal 运行时库中的过程和函数处理文本文件的方法。在对文本文件进行任何处理之前,首先要打开此文本文件。声明变量:通过此变量可以来引用一个文本文件。打开一个文件需要两步:首先是A s s i g n F i l e ( ) ,它可以将文件变量与一个文件关联起来。例如:这时,你可以进行第二步:打开文件。有三种方式打开文件:使用R e w r i t e ( )过程创建并打开文件;对于一个已存在的文件,此操作将使文件被覆盖;使用R e s e t ( )过程只读地打开一个文件;使用Append() 过程向已存在的文件追加文本。注意Reset()将以可读写方式打开类型文件和无类型文件。可以使用C l o s e F i l e ( )来关闭一个已打开的文件。下例是各种调用的函数。文件的打开与关闭AssignFile :把一个外部文件名和一个文件变量相关联Reset :打开一个存在的文件Rewrite :创建并打开一个新文件(或覆盖原有文件)Append :以添加方式打开一个文件(只适用于文本文件)CloseFile :关闭一个打开的文件FileOpen :打开一个特定的文件并返回文件句柄FileCreate :创建一个给定文件名的文件并返回文件句柄FileClose :关闭一个特定句柄的文件后边三个文件主要供系统内部使用,在文件复制的编程中也往往会用到。它们操作的对象是文件句柄而不是文件变量。文件定位Seek:把文件当前位置移到指定部分FilePos:返回文件的当前位置Eoln:返回行结束标志EOF:返回文件结束标志FileSeek: 改变当前文件指针的位置 还有个问题,如何判断文件已打开?要不要读写完之后就关闭文件,下次读或者写时再打开? 正常情况下是这样 用TFileStream 对于通过Byte数组进行文件操作的,在FTP中经常会使用到,我也是在Delphi调用Web Service进行文件的上传和下载时找到这两个函数的,挺好用的,推荐给大家。(申明:非本人所写)1. 将Byte数组生成文件procedure ByteArrayToFile(const ByteArray : TByteDynArray; const FileName : string );var Count: integer; F: FIle of Byte; pTemp: Pointer;begin AssignFile( F, FileName ); Rewrite(F); try Count := Length( ByteArray ); pTemp := @ByteArray[0]; BlockWrite(F, pTemp^, Count ); finally CloseFile( F ); end;end;2. 将文件生成Byte数组function FiIeToByteArray(const FileName:string ):TByteDynArray;const BLOCK_SIZE=1024;var BytesRead,BytesToWrite,Count:integer; F:File of Byte; pTemp:Pointer;begin AssignFile( F, FileName ); Reset(F); try Count := FileSize( F ); SetLength(Result, Count ); pTemp := @Result[0]; BytesRead := BLOCK_SIZE; while (BytesRead = BLOCK_SIZE ) do begin BytesToWrite := Min(Count, BLOCK_SIZE); BlockRead(F, pTemp^, BytesToWrite , BytesRead ); pTemp := Pointer(LongInt(pTemp) + BLOCK_SIZE); Count := Count-BytesRead; end; finally CloseFile( F ); end;end;function Encrypt(mStr: string; mKey: string): string;var I, J: Integer;begin J := 1; Result := ''; for I := 1 to Length(mStr) do begin Result := Result + Char(Ord(mStr[I]) xor Ord(mKey[J])); if J + 1 <= Length(mKey) then Inc(J) else J := 1; end; {自己加步骤}end;function Decrypt(mStr: string; mKey: string): string;var I, J: Integer;begin J := 1; Result := ''; {自己加步骤} for I := 1 to Length(mStr) do begin Result := Result + Char(Ord(mStr[I]) xor Ord(mKey[J])); if J + 1 <= Length(mKey) then Inc(J) else J := 1; end;end;procedure TForm1.Button1Click(Sender: TObject);const cKey1 = '谁想试试怎么破'; cKey2 = '我可不愿意这样玩(1)我可不愿意这样玩(2)我可不愿意这样玩(3)'; cKey3 = 'Memo2.Text := Decrypt(Encrypt(Memo1.Text, cKey), cKey);';var S: string; //加密后的字符begin S := Encrypt(Encrypt(Encrypt(Memo1.Text, cKey1), cKey2), cKey3); ShowMessage(S); Memo2.Text := Decrypt(Decrypt(Decrypt(S, cKey3), cKey2), cKey1);end;Delphi 程序启动报错 “A call to an OS function failed.”遇到了Delphi程序启动时就报错,错误提示为:"A call to an OS function failed.",跟踪代码分析发现这个错误是在程序初始化启动时执行到Application.Run;这里发生的,一时无头绪,后经多番调查,找到了原因——程序主窗体中重载了WndProc过程,而其中写漏了inherited;这一句procedure TForm1.WndProc(var Message: TMessage);begin inherited; { do sth. }end;Delphi中@,^,#,$分别表示什么?@:取址运算符; var int:integer; p:^integer; new(P); int:=24; p:=@int; dispose(P);^:指针的引用解析操作符; var pint:^integer;new(pint); showmessage(inttohex(integer(@pint),8)); pint^:=$ff; showmessage(inttohex(pint^,4));#:ASCII码值表示符; const tab_key=#9;//TAB键的ASCII值总结: ^: 指针 @: 取址 #: 十进制符 $: 十六进制符---------------------------------在DELPHI中^ 符号是什么意思符号 ^ 有两种用途,当它出现在类型标识符之前,如 ^typeName 表示一个类型,该类型表示指向typeName类型变量的指针。当它出现在指针变量之后,如pointer^该符号对指针解除参照,也就是说,返回存储在内存地址(该地址保存在指针中)的值 指针,指向的数据. var I: Integer; PI: ^Integer; begin I := 10 PI := @I;; PI^ := 20; I := PI^; end; 取指针的方法,比如y:=p^; 就是指为Y赋值指针PPint:^string;在这里将^放在数据类型之前,说明是声明的字符串指针类型!如果想取出指针引用的值的话,就将^放在声明的类型后就可以了,比如:Pint^想取Pint类型的所引用地址的话,就将@放在之前就可以了,比如:@Pint数值转换成十六进制。如 x:=$11;edit1.text:=inttostr(x) ; edit显示的是17delphi中Message消息的使用方法unit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; constWM_ME=WM_USER+100; //自定义消息; type TForm1 = class(TForm) Button1: TButton;procedure Button1Click(Sender: TObject);//第一种消息处理方式; 只能处理常量消息; procedure wmme(var message:TMessage);message WM_ME; //自定义消息处理过程,专门处理WM_ME消息; private { Private declarations } public{ Public declarations }//第二种消息处理方式;可能处理常量或变量消息;procedure WndProc(var message:TMessage);override; //重载窗口消息过程//第三种消息处理方式 procedure WMCommand(var Message: TWMCommand); message WM_COMMAND; //命令消息处理过程 procedure WMSysCommand(var Msg:TWMSysCommand);message WM_SYSCOMMAND; //处理系统性消息; end;var Form1: TForm1;implementation{$R .dfm} procedure TForm1.Button1Click(Sender: TObject);begin SendMessage(Handle,WM_ME,0,0); //发送消息WM_ME ; 消息先由WndProc处理,再交给wmme处理;end; procedure TForm1.WMSysCommand(var Msg: TWMSysCommand);begin //下面代码的作用是,用户如果点击了标题栏上的最小化和关闭按钮,则隐藏窗体。 if (Msg.CmdType=SC_MINIMIZE) or (Msg.CmdType=SC_CLOSE) then begin Self.Hide; end else DefaultHandler(Msg); //这句的作用是继续处理其它消息;end; procedure TForm1.WMCommand(var Message: TWMCommand);begin //第三种消息处理方式if Message.NotifyCode = BN_CLICKED thenif FindControl(Message.Ctl) = Button1 then showmessage(‘点击了Button1’);inherited;end; procedure TForm1.wmme(var message: TMessage);begin ShowMessage(IntToStr(Handle)+ 'wmme'); //第一种消息处理方式end; procedure TForm1.WndProc(var message: TMessage);begin if message.Msg=WM_ME then //第二种消息处理方式 ShowMessage(IntToStr(Handle)+ 'WndProc'); inherited WndProc(Message); //这里inherited才会触发一次wmme消息;end;end. 实例2/////////////////////////////////////////////////////////////消息的广播方式////////////////////////////////////////////////////////////////////////////////////消息广播只能将消息传递到接收消息的主程序中,MDIChild窗体不能接收到广播消息;/////////unit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } procedure WndProc(var message:TMessage);override; end;var Form1: TForm1; MyMessage: DWORD;implementation{$R .dfm}{ TForm1 }procedure TForm1.WndProc(var message: TMessage);begin if message.Msg=MyMessage then //第3步:重载Windows消息处理过程,处理接收到的MyMessage消息; ShowMessage(FloatToStr(Handle)+ 'MyMessage'); inherited WndProc(Message);end; procedure TForm1.Button1Click(Sender: TObject);begin SendMessage(HWND_BROADCAST,MyMessage,0,0); //第2步:广播MyMessage消息;end;/////////预先注册好Windows消息;第一种方法////////////////////procedure TForm1.FormCreate(Sender: TObject);begin //同一字符串,如'MyMessageMe'在不同的程序中调用RegisterWindowMessage注册消息时,返回的MyMessage结果是一样的。这样为在不同程序之间广播消息提供了可能。即不同程序注册消息时,必须注册相同的注符串。 MyMessage:=RegisterWindowMessage('MyMessageMe'); //第1步:注册Windows消息,重点在于返回的值MyMessageend;/////////预先注册好Windows消息;第二种方法////////////////////{ initialization MyMessage:=RegisterWindowMessage('MyMessageMe');} //BroadcastSystemMessage,可以在进程之间广播消息;procedure TForm1.SendSMSMessage;var SMSMessage:Cardinal; recipt:Cardinal;begin try SMSMessage:=RegisterWindowMessage('SendSMSMessage'); recipt:=BSM_ALLDESKTOPS; //所以桌面程序都可以接收 BroadcastSystemMessage(BSF_POSTMESSAGE,@recipt,SMSMessage,0,0); except end;end; end.
* 声明:本文由其作者或媒体撰写,观点仅代表其本身,不代表本站立场。
编辑
HappyLifeLife.com HappyLifeLife.com HappyLifeLife.com HappyLifeLife.com HappyLifeLife.com HappyLifeLife.com HappyLifeLife.com HappyLifeLife.com HappyLifeLife.com HappyLifeLife.com
 
<< < - > >>
[C++][*] [C][*] [po][*] [JS][*] [JAVA][*] [HIS][*] [Web][*] [H][*] [GIT][*] [Android][*] [DB][*] [0][*] [TL][*] [O][*] [3D][*] [PAS][*] [IOS][*] [算法][*] [地球][*] [学习方法][*] [探索][*] [宇宙][*] [Linux][*] [阅读秘诀][*] [考试技巧][*] [...]
天天快乐生活[HappyLifeLife.com]
欢迎来访 快乐空间 热点新闻 我的分享 读书频道 七彩生活 精彩世界 快乐搜索 
ICP备15040518 | ©1999-2018 HappyLiveLife.com 版权所有 | 服务 | 爱新闻 | 爱分享 | 在线搜索 | 招贤纳士
欢迎来访 快乐空间 热点新闻 我的分享 读书频道 七彩生活 精彩世界 快乐搜索 
ICP备15040518 | ©1999-2018 HappyLiveLife.com 版权所有 | 服务 | 爱新闻 | 爱分享 | 在线搜索 | 招贤纳士