充分利用Windows API扩展Delphi函数

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情


    Borland Delphi是与Visual Basic相似的可视化开发工具,但其功能比VB更加强大。
例如,Delphi支持汇编语言和指针操作、全面支持Windows API函数及外部DLL的使
用,使得它具有更广泛的应用范围。即使用于编制一些较小的应用程序,Delphi与VB
相比看来不相上下,
但由于Delphi是编译型的语言,其编译后的EXE文件可以真正脱
离Delphi的环境独立运行,而VB 生成的EXE文件离开了VB软件包的一大堆DLL、
VBX等文件可能会无法执行。而更重要的是,一般用户往往并不真正知道自己开发
的VB程序到底使用了哪些DLL一类的文件,为了保证程序的正常运行,可能在最后的
安装盘中包含了不少其实并不需要的文件。所以,一般用户用VB很难开发出真正实
用的软件,难怪有人说VB是"先甜后苦"。Delphi实际上可以看作是VP(Visual Pascal),所
以它的易学性也可与VB媲美。今年发布的Delphi2.0可以为Windows 95、Window s NT
开发32位程序,使得VB 4.0的优势也不复存在。看来,在今后一段时间内,将会有更多
的人使用Delphi开发Windows应用程序。在DOS下开发过软件的人都知道int 2lh的重要。
与此类似,Windows应用程序也是离不开Windows API的,许多较底层的操作必须通过
API函数来实现。为此,无论是C++、VB还是Delp hi都无一例外地支持API函数的调
用,只是VB由于自身的特点所限制,仅支持部分API函数,而C++、Delphi则全面地支持
API函数。相比之下,Delphi对API函数的调用最简捷,达到了与自身的内部函数几乎
不分彼此的程度(只要求在interfaces中的user段中加上Windows即可,而这一步Delphi
会自动为您做到),VB则相当繁琐。以调用获得Windows系统子目录的API函数为例
,我们来看一下二者有什么不同:API函数格式的描述:WORD GetSystemDirectory(lpBuffer,
nSize)

    VB 4.0调用时首先要做如下申明:
    Declare Function GetSystemDirectory Lib"kernel32"(ByVal
lpBuffer As String, ByValnSize As Long)As Long
    然后才能使用:
    Dim lpBuffer As String *255
    Size&=GetSystemDirectory(lpBuffer,255)
    而Delphi只需像调用内部函数那样:
    var lpBuffer:PChar;{API函数必须使用null结尾的字符串}
    Size:WORD;{返回的系统子目录字符串实际长度}
    begin lpBuffer:=StrAlloc(255);{预留字符串长度}
    Size:=GetSystemDirectory(lpBuffer,255);end;
    由此可见,Delphi是可以充分利用Windows API来扩展其自身功能的。当然,在大
多数情况下,Delphi本身的函数功能已经足够使用了。但是,在有些情况下,需要使
用API函数来实现一些特殊的功能或完善Delphi的一些功能。下面提供两个实例
来说明这一点。

    一、信息框函数MsgBox
    信息框是Windows应用程序中使用得较多的一种对话机制,它被广泛地用于提
示、选择程序走向,是一个重要的程序控制手段。Delphi提供的信息框函数MessageDlg
功能比较强,其最大优点是可以任意设定信息框的按钮(使用了集合类型),但其缺
点也是很明显的,主要表现在标题字符串不能由用户自己设置;窗口弹出时寂静无声
;按钮不能随着Windows的不同语言的版本显示不同的文字(例如无论在哪种语言版

本下都只能显示"OK"、"Yes"等英文字符)。这些优点和缺点都是由于它是Delphi
自己实现的,而不是通过调用系统API函数实现的,故不能使用系统的语言环境、
多媒体等资源。这样,所开发的程序在中文版中显示信息框时与周围的窗口显得
极不协调。而VB在这方面却做得较好,所以我们按照VB的格式自定义一个信息
框函数MsgBox。下面的函数都假定是在TForml中定义的。为了使用方便,我们首
先在Interfaces段中定义一些符号常量:

    const
      {第一组:按钮内容选择}
    OKOnly=0;{仅显示"确定"按钮}
    OKCancel=1;{显示"确定"和"取消"按钮}
    AbortRetryIgnore=2;{"中止""重试""放弃"}
    YesNoCancel=3;{"是""否""取消"}
    YesNo=4;{"是"和"否"}
    RetryCancel=5;{"重试""取消"}
    {第二组:显示图标选择}
    Critical=16;{"STOP"图标}
    Question=32;{"?"图标}
    Excalamation=48;{"!"图标}
    Information=64;{"i"图标}
    {第三组:缺省指针位置(激活状态)}
    DefaultButton1=0;{第一按钮}
    DefaultButton2=256{第二按钮}
    DefaultButton3=512{第三按钮}
    {第四组:信息框方式}
    ApplicationModal=0;{应用方式}
    SystemModal=4096;{系统方式}
    然后,建立函数MsgBox,由于API函数中使用的字符串必须以mull结尾,所以使用了另
一个自定义的函数StrToPch来将Pascal类型字符串转换成为以mull结尾的字符串。参
数说明 msg为信息框标题变量; mbType为规定信息框类型的变量,使用方式是"mbType=
按钮内容+图标+缺省指针+信息框方式"。便如您想得到一个含"确定"和"取消"两个按
钮、带"?"图标、缺省指针指向第二个按钮(即"取消")的信息框,那么就该这样设置:
mbType:=OKCancel+Question+DefaultButton2;

    title为信息框中显示文本的变量。
    MsgBox的返回值与MessageDlg函数的返回值完全一样,例如返回mrYes表示"Yes"或
"是" 按钮被按下,mrNo表示"No"或"否"按钮被按下等等。可参考MessageDlg函数的说
明。下面即是在Delphi中通过调用Windows API的GetActive Windows函数和MessageBox
函数来实现MsgBox函数的代码:{信息框函数}

    function TForm1.MsgBox(msg:string;mbType:Word;title:stri
ng):Word;
    var hWnd:HWND;
    1pText,!pCaption:Pchar;
    begin
      1pText:=StrToPch(title);
    1pCaption=StrToPch(msg);
    hWnd:=GetActiveWindow();
    MsgBox:=MessageBox(hWnd,1pText,1pCaption,mbType);
    end;
    {将Pascal字符串转换成null结尾字符串函数}
    function TForm1.StrToPch(Str:string):PChar;
    var
    a:PChar;
    begin
      a:=StrAlloc(Length(Str)+1);
      StrPCopy(a,Str);
      StrToPch:=a;
    end;

    二、文件拷贝函数CopyFDelphi提供了一组比较完整的文件操作函数,用它们可以完
成几乎全部的文件操作,但恰恰缺少拷贝文件的函数。而文件拷贝的使用应该说是比
较常用的,因此,笔者利用几个API函数定义了一个功能很强的文件拷贝函数CopyF。
该函数代码如下(请注意:该函数中调用了上述的MsgBox函数):

    {文件拷贝函数}
    function TForm1.CopyF(var ExistingFileName:string;const
NewFileName:string; var Mode:Integer):Boolean;
    var
      EFile,NFile:PChar;
    CpFlag,FailIfExists:Boolean;
    msg:string;
    ErrID,mbType:integer;
    begin
      EFile:=StrToPch(ExistingFileName);
    NFile:=StrToPch(NewFileName);
    if (Mode=1) or (Mode=3) then FailIfExists:=True
    else FailIfExists:=False;
    CpFlag:=CopyFile(EFile,NFile,FailIfExists);
    if not CpFlag then
    begin
      ErrID:=GetLastError();
    ExistingFileName:=SysErrorMessage(ErrID);
    if Mode<2 then
    begin
      msg:='CopyFile Error!';
    mbType:=OKOnly+Excalamation;
    MsgBox(msg,mbType,ExistingFileName);
    end;
    Mode:=ErrID;
    end;
    CopyF:=CpFlag;
    end;
    CopyF函数参数说明如下:
    若拷贝操作成功,函数CopyF返回True,失败函数CopyF返回False。
    ExistingFileName是字符变量,输入时代表源文件名。若操作失败,则返回错误信息字符
串(由于调用了API函数,在中文Windows下该信息当然就是中文)。 NewFileName是字符
常量,代表目标文件名。

    Mode是整数变量,输入时代表拷贝的方式:
    0表示如果目标文件存在,将覆盖它,操作失败,将显示具有出错信
息的信息框;
    1表示如果目标文件存在,不覆盖它,操作失败,显示具有出错信息
的信息框;
    2表示如果目标文件存在,将覆盖它,操作失败,不显示信息框;
    3表示如果目标文件存在,不覆盖它,操作失败,不显示信息框;
    当拷贝操作失败时,Mode将返回出错代码。
    总之,灵活应用API函数可以使您的应用程序的界面与您使用的Windows的语言环境相
当和谐地融为一体,摆脱掉Delphi的痕迹,使您的程序给人以相当"专业"的感觉。最后说明
一点,如果要使这些自定义的函数成为"全局"的,在其它单元中也能够使用,需将函数标题
复制到Unitl单元interfaces的type段中(应删除"TForml."几个字符);然后在调用函数的其他单
元implementation中的user段中加入Unitl;在函数名前要加上"Form1."几个字符,如在Unit2单
元中调用MsgBox就应写成Form1.MsgBox。

    (以上所有函数均在Windows 95中文版使用Delphi Desktop V2.0
调试通过)

DelphiWindows API的深度融合:高效调用与应用实践 本文详细介绍了Delphi中调用Windows API的方法,包括基本概念、调用步骤、参数和返回值处理、错误处理、内存管理以及使用类型库等方面的内容,并通过实际代码示例展示了API调用的过程。Delphi通过其丰富的VCL(Visual Component Library)封装了大量Windows API调用,但开发者也可以直接调用未封装的API函数,以实现特定功能。随着技术的发展,DelphiWindows API的集成将更加深入和智能,提供更多的自动化工具和安全特性,帮助开发者更高效地进行系统编程。 阅读详情

相关推荐

深入探索DelphiWindows API编程

本文深入探讨了Delphi编程语言与Windows API的交互,包括窗口操作、文件输入/输出、输入处理、字符串和原子操作、剪贴板功能以及系统信息查询等方面的技术细节。书中通过详实的函数描述、使用示例和最佳实践,旨在为经验丰富的Delphi程序员提供一个全面而准确的Win32 API编程指南。

weixin_35019679的博客 1022

WinAPI (Delphi版)

Creating Windows CreateMDIWindow CreateWindow CreateWindowEx RegisterClass RegisterClassEx UnregisterClass Message Processing BroadcastSystemMessage CallNextHookEx CallWindowProc DefFrameProc DefMDIChildProc DefWindowProc DispatchMessage GetMessage GetMessageExtraInfo GetMessagePos GetMessageTime GetQueueStatus InSendMessage PeekMessage PostMessage PostQuitMessage PostThreadMessage RegisterWindowMessage ReplyMessage SendMessage SendMessageCallback SendMessageTimeout SendNotifyMessage SetMessageExtraInfo SetWindowsHookEx TranslateMessage UnhookWindowsHookEx WaitMessage Window Information AnyPopup ChildWindowFromPoint ChildWindowFromPointEx EnableWindow EnumChildWindows EnumPropsEx EnumThreadWindows EnumWindows FindWindow FindWindowEx GetClassInfoEx GetClassLong GetClassName GetClientRect GetDesktopWindow GetFocus GetForegroundWindow GetNextWindow GetParent GetProp GetTopWindow GetWindow GetWindowLong GetWindowRect GetWindowText GetWindowTextLength IsChild IsIconic IsWindow IsWindowEnabled IsWindowUnicode IsWindowVisible IsZoomed RemoveProp SetActiveWindow SetClassLong SetFocus SetForegroundWindow SetParent SetProp SetWindowLong SetWindowText WindowFromPoint Processes and Threads CreateEvent CreateMutex CreateProcess CreateSemaphore CreateThread DeleteCriticalSection DuplicateHandle EnterCriticalSection ExitProcess ExitThread GetCurrentProcess GetCurrentProcessId GetCurrentThread GetCurrentThreadId GetExitCodeProcess GetExitCodeThread GetPriorityClass GetThreadPriority GetWindowThreadProcessId InitializeCriticalSection InterlockedDecrement InterlockedExchange InterlockedIncrement LeaveCriticalSection OpenEvent OpenMutex OpenProcess OpenSemaphore PulseEvent ReleaseMutex ReleaseSemaphore ResetEvent ResumeThread SetEvent SetPr

Delphi实现Windows外壳扩展编程教程

本文还有配套的精品资源,点击获取 简介:Windows外壳扩展编程通过COM技术使开发者能够自定义Windows界面元素如文件夹视图和上下文菜单。Delphi环境简化了这一过程,提供了对COM的直接支持和可视化工具。本教程包含实例和指南,指导如何在Delphi中实现接口,创建右键菜单项和自定义属性页,以及外壳扩展的注册和测试。 1. Windows外壳扩展编程简介...

weixin_29050829的博客 1260

Delphi中的Windows API调用

为了能在Windows下快速开发应用程序,DelphiWindows的控件都进行了很好的封装,这样,我们就可以直接使用Delphi的控件来编写程序,而不用使用格式、调用控制复杂的API来进行开发,为我们节省了大量的开发时间。 如何在Delphi中调用数据类型不兼容的API

SauceJ的专栏 1850

Delphi - 通过WinAPI WinExec直接调用系统工具

看如下代码: 1 WinExec('mspaint.exe', SW_SHOWNORMAL); // SW_SHOWNORMAL = 1 系统画图 2 3 WinExec('write.exe', SW_SHOWNORMAL); // SW_SHOWNORMAL = 1 写字板 4 5 WinExec('mstsc.ex...

weixin_30252155的博客 263

充分利用Windows API扩展Delphi函数 (转)

充分利用Windows API扩展Delphi函数 (转)[@more@]充分利用windows api扩展Delphi函数 袁卫国 Borland Delphi是与Visual Basic相似的可视化开发工...

csd3176的博客 125

DELPHI中使用API函数

所以,无论是C++,VB还是DELPHI都无一例外的支持API函数的调用,C++和DELPHI是全面支持API函数,而VB仅支持部分API函数(部分也不少了,已经有几百条之多),尤其是DELPHI调用API函数最方便,已经达到与API函数合二为一的境界,调用API函数和使用自身的函数几乎一样。注:本文只为提高DELPHI能力的朋友所写,非一般入门级的教程,所以文中所有DELPHI的自身函数和一些基本技巧不再说明,请朋友查阅DELPHI的联机帮助手册。返回值:BOOL,如存在弹出式菜单,则返回TRUE。

s13596191285的博客 471

Delphi调用API函数实例

什么是API函数Win32 API即为Windows应用程序编程接口(Application Programming Interface)。所有在Win32平台上运行的应用程序都可以调用这些函数。早期的PC机内存非常少,Windows的设计者们不仅要把大量的代码和资源放入,而且还要留出足够的空间让应用程序运行,解决这种矛盾的方法就是通过让多个程序共享常用的代码来实现,这些被共享的代码就是今天所说的

xuangege的专栏 6092

Delphi 常用API 函数

Delphi 常用API 函数 AdjustWindowRect 给定一种窗口样式,计算获得目标客户区矩形所需的窗口大小 AnyPopup 判断屏幕上是否存在任何弹出式窗口 ArrangeIconicWindows 排列一个父窗口的最小化子窗口 AttachThreadInput 连接线程输入函数 BeginDeferWindowPos 启动构建一系列新窗口位置的过程 B

靠别人不如靠自已。 9430

Delphi 使用API函数详解

DOS下的INT21H对于开发DOS程序很重要,而对于在WINDOWS下开发程序,了解API函数是很有必要的。元件就像招式,而API函数就好比内功心法,有了高深的内力,那么学习招式就易如反掌啦。所以,掌握的API函数越多,你就越可能成为DELPHI高手,甚至WINDOWS编程高手。所以,无论是C++,VB还是DELPHI都无一例外的支持API函数的调用,C++和DELPHI是全面支持API函数,而

『罾心製作·娟儿·Delphi·家园』 1075

Delphi开发中Windows API函数的应用

Delphi作为快速开发Windows95/NT下应用程序的工具,已经为越来越多的开发者采用。但是,如果要开发出专业的Windows应用软件,还需要使用大量的Windows API函数,以下是笔者开发管理软件中的几个应用实例。 一、判定Windows版本 众所周知,Windows95/ NT某些地方有些差别,为了使应用程序避免出现因为系统不符合而导致的错误,有必要自动判定系统版本。这可以通过API

chinawwc的专栏 1059

使用Win32 API EnumWindows函数Delphi中枚举系统窗口

EnumWindowsWindows API 中的一个函数,用于枚举所有顶级窗口,并为每个窗口调用指定的回调函数。其函数原型如下:WNDENUMPROC lpEnumFunc, // 回调函数的地址LPARAM lParam // 用户提供的值传递给回调函数lpEnumFunc是一个指向回调函数的指针,这个回调函数必须被定义为接受两个参数:HWND和LPARAM类型的窗口句柄以及传递给 EnumWindows 的lParam。lParam是传递给回调函数的附加参数。

weixin_42611310的博客 1007

DELPHIAPI简述

DELPHIAPI简述res_str="http://passport.baidu.com/?reg&tpl=tb&u="+escape(window.location.href)+"&aid=6";login_str="http://passport.baidu.com/?login&tpl=tb&u="+escape(window.location.href)+"&aid=6";do

创业轨迹 4974

DELPHI中使用API函数详解

大家别误会,这里的戴妃可不是已经香销玉殒的英国王妃,而是INPRISE的招牌产品DELPHI的中文译名!介绍DELPHI的文章已经很多了,大家是不是被它强大的开发功能所折服?可视化编程的出现,使很多朋友圆了程序梦。的确,几个控件的搭配再加上几条语句,也许一个软件就出来了。但是,你是否已不满足使用别人的元件?想更深入的了解WINDOWS的编程?更换的掌握DELPHI?OK,请继续往下看。   DOS

1917

怎样在DELPHI中使用API函数

实际上,在DELPHI中调用WIN32 API函数与在C或C++中调用WIN32 API函数没有大的区别。DELPHI中将C或C++中引用 的WINDOWS.H头文件改写为WINDOWS.PAS单元,使WINDOWS API函数的定义符合PASCAL语法。而其他的头文件在DELPHI中也都有相应的.PAS单元一一对应,所以在DELPHI中调用API函数时,只须将相应的API函数单元加入到USES语...

JDDXM的专栏 297

深入理解Windows APIDelphi编程

本文详细探讨了Windows编程中的关键概念,如对象句柄、常量、字符串处理以及如何导入和使用Windows API函数。特别指出,正确理解和使用Windows API函数Delphi开发者必备的技能,尤其是在处理特定功能或优化应用程序大小时。文章还涉及了Windows的Unicode支持、回调函数的概念、以及窗口移动和排序的高级技术。

weixin_34581040的博客 714
上一篇: Delphi中RichEdit的奥妙
下一篇: 用Delphi实现风Word97风格的工具栏
wljcr
博客等级 码龄26年 6粉丝 44原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值