浅议Delphi中的Windows API调用

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

可有时候这些控件解决不了我们的问题,这个时候我们就不得不使用API了,也就是Windows的应用程序接口。这样,问题也就随之而来了,API是用C++语言编写的,而Delphi的脚本语言是PASCAL,两者使用的数据类型是不兼容了。那么,如何在Delphi中调用数据类型不兼容的API呢,这就是本文中我为大家介绍的内容了。

我们在Delphi中最常用到的一个数据类型是String类型,可API并不支持,那么当我们需要从API中得到一个string类型的值时该如何去做呢?看看下面的程序:

function GetSysPath: string;
var
 sTmp: string;
begin
 result := ’’;
 //调用WindowsApi得到Windows的系统路径
 SetLength(sTmp,256);
 GetSystemDirectory(PChar(sTmp),256); //这是一个API函数
 SetLength(sTmp,StrLen(PChar(sTmp)));
 result := sTmp + ’\’;
end;

在该函数中,调用了API函数GetSystemDirectory,它的第一个参数是一个指向以NULL结尾字符串的指针,在Delphi中,这种数据类型是PCHAR,所以这里要进行数据类型转换,要写成PChar(sTmp)。 我们再看另外一个例子:

procedure TForm1.ChangeAppIcon;
var
 icon: TIcon ;
begin
 icon := TIcon.Create;
 try
  icon.Handle := ExtractIcon(application.Handle,pchar(’D:\WINNT\regedit.exe’),0); //这是一个API函数
  if icon.Handle <> 0 then
   application.Icon := icon;
  finally
   icon.Free;
 end;
end;

该过程通过API函数得到一个应用程序的图标,来动态改变当前程序的图标。API函数ExtractIcon返回的是一个HICON类型,是一个指向图标的指针,如果写成application.Icon = ExtractIcon(application.Handle, pchar(’D:\WINNT\regedit.exe’), 0); 编译肯定不通过,数据类型不一致吗!application.Icon属性是Ticon类型的,我们可以创建一个 Ticon,把API的返回值赋给Ticon.Handle,最后将ICON赋值给application.Icon,就解决了我们的问题。

通过上面的例子,我们可以看到,Delphi并不直接支持Windows中的数据类型,只能通过封装的形式来支持。要熟练地调用API函数,我们一定要熟悉Delphi的封装机制,多看、多写,多去实践,那么,我们就能够随心所欲的调用API函数了。

时间: 2025-01-21 05:01:30

浅议Delphi中的Windows API调用的相关文章

教你如何使用分组密码对shellcode中的windows api字符串进行加密

本文讲的是教你如何使用分组密码对shellcode中的windows api字符串进行加密, 介绍 字符串/模式匹配算法是当前最流行和最简单的检测shellcode方法.原理很简单:所有代码都有其独特的特征,可以根据这种特征去在内存中验证.即使没有事先分析shellcode,我们也可以得到一些有用的变量,或者至少看起来它是一串可疑代码,需要进一步分析. 我提到的有用变量是指API字符串以及hash值,它们已经在检测恶意代码历史上使用了20多年.如果想要绕过这种检测方法,编写shelcode过程中

Delphi下用Windows API创建窗体

// Delphi 下调用Windows API 创建窗体.// program delphi; uses windows, messages; const hellostr='Hello World!'; {$R delphi.res} //窗口消息处理函数. function MyWinProc(hWnd:THandle;uMsg:UINT;wParam,lParam:Cardinal):Cardinal;exp ort;stdcall; var hdca,hdcb:THandle; //设

Delphi中动态链接库两种调用方式的比较

一.动态链接库的概念 动态链接库(Dynamic Link Library,缩写为DLL)是一个可以被其它应用程序共享的程序模块,其中封装了一些可以被共享的例程和资源.动态链接库文件的扩展名一般是dll,也有可能是drv.sys和fon,它和可执行文件(exe)非常类似,区别在于DLL中虽然包含了可执行代码却不能单独执行,而应由Windows应用程序直接或间接调用. 动态链接是相对于静态链接而言的.所谓静态链接是指把要调用的函数或者过程链接到可执行文件中,成为可执行文件的一部分.换句话说,函数和

Delphi中idhttp.post方式调用datasnap rest远程方法

idhttp.get方式调用,这种比较简单,大家都会.post方式网上却没有任何成功的代码,本人也是摸索了一个上午才搞定. 分享给大家. (1)post方式调用的远程方法,方法名必须加"update"前缀,不加行不?你试下啦. function TServerMethods1.updateecho(const value: String): String; begin Result := value; end; 更多精彩内容:http://www.bianceng.cnhttp://w

浅谈Delphi中进程间的数据共享

DLL是创建Windows应用程序,实现代码重用的重要手段.那么当我们需要在进程间共享数据时,怎样做才能快捷方便地实现呢?在32位应用系统中,每个应用程序会将DLL映射到自己的地址空间,同时DLL中的数据也就随之被映射了.这样,每个应用程序都有自己的数据实例,在一个应用程序中修改DLL中的全局变量,不会影响其它的应用程序.DLL的使用似乎与我们的目的相背离,那么如何才能实现我们想要的东东呢?这里给大家介绍一种特殊的技术,那就是内存映射文件. 内存映射文件提供了一种方法,就是在WIN32系统的地址

浅议Oracle中的进制转换

oracle|转换 作者: Eygle 出处: BLOG 进制转换是开发中经常需要用到的,本文简单介绍几种常用的进制转化方法. 一 16进制转换为10进制 可以通过to_number函数实现 SQL> select to_number('19f','xxx') from dual; TO_NUMBER('19F','XXX') ---------------------- 415 SQL> select to_number('f','xx') from dual; TO_NUMBER('F',

浅议网页中的隐藏内容

隐藏内容就是一段文本,或者一些关键词,被包含在网页中,用户在浏览器中是看不见的,可是搜索引擎却能看见.这样的文字,我们称之为隐藏内容. 其目的是欺骗搜索引擎,来获得较好的关键词排名. 这是一种非常老旧的搜索引擎作弊的手法,几乎所有的主流搜索引擎都可以处理绝大部分的隐藏内容作弊. 可是这样的手段,在现在的网站中,还是时常可以看到,比如我曾经举过的例子,利用图片alt属性和CSS定位的作弊手法. 有时,通过这样的作弊手法,可以获得暂时的排名提高,可是很快就会被发现,也许只是被降低排名,更为严重的,可

在C#中通过P/Invoke调用Win32DLL

  我在自己最近的编程中注意到一个趋势,正是这个趋势才引出本月的专栏主题.最近,我在基于 Microsoft .Net Framework 的应用程序中完成了大量的 Win32 Interop.我并不是要说我的应用程序充满了自定义的 interop 代码,但有时我会在 .Net Framework 类库中碰到一些次要但又繁絮.不充分的内容,通过调用该 Windows API,可以快速减少这样的麻烦. 因此我认为,.Net Framework 1.0 或 1.1 版类库中存在任何 Windows

C#+低级Windows API钩子拦截键盘输入

window 一. 简介 猫和婴儿有很多共同之处.他们都喜欢吃家中养植的植物,都非常讨厌关门.他们也都爱玩弄你的键盘,结果是,你正发送给你的老板的电子邮件可能是以半截句子发送出去的,你的Excel帐户也被加入了一些乱七八糟的内容,并且你还没有注意到,当打开Windows资源管理器时,若干文件已经被移到了回收站! 其解决方案是,开发一个应用程序实现如下功能:只要键盘处于"威胁状态"你就可以进行切换,并确保任何键盘输入活动都不会造成危害.本文想展示如何使用一种低级Windows API钩子