浅议Delphi中的Windows API调用(举的两个例子分别是String和API,都不错,挺具有代表性)
浅议Delphi中的Windows API调用
http://tech.163.com/school • 2005-08-15 10:57:41 • 来源: 天极网
为了能在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函数了。
浅议Delphi中的Windows API调用(举的两个例子分别是String和API,都不错,挺具有代表性)的更多相关文章
- Delphi中,除了应用程序主窗口会显示在任务栏上,其它窗口默认都不会显示在任务栏.
Delphi中,除了应用程序主窗口会显示在任务栏上,其它窗口默认都不会显示在任务栏. Delphi中,除了应用程序主窗口会显示在任务栏上,其它窗口默认都不会显示在任务栏.没有MS开发环境中的ShowI ...
- Delphi For Android 开发笔记-附:如何Delphi中同时实现Windows、Android版的GetModuleFileName函数
在Windows中开发DLL时,经常会需要获取当前DLL所在目录以便读取同目录下的其他文件,而目前Delphi在开发android时,其实没多大必要获取,因为整个工程只有一个so文件,而这个so文件也 ...
- FastReport调用Delphi中的人民币大写转换自定义函数
FastReport调用Delphi中的人民币大写转换自定义函数 FastReport调用Delphi中的人民币大写转换自定义函数 function TJzpzEdit1.MoneyCn(mmje ...
- ABP开发框架前后端开发系列---(5)Web API调用类在Winform项目中的使用
在前面几篇随笔介绍了我对ABP框架的改造,包括对ABP总体的介绍,以及对各个业务分层的简化,Web API 客户端封装层的设计,使得我们基于ABP框架的整体方案越来越清晰化, 也越来越接近实际的项目开 ...
- [转]Delphi调用cmd的两种方法
delphi调用cmd的两种方法vars:string;begins:='cmd.exe /c '+edit1.Text+' >c:\1.txt';winexec(pchar(s),sw_hid ...
- Delphi中根据分类数据生成树形结构的最优方法
一. 引言: TreeView控件适合于表示具有多层次关系的数据.它以简洁的界面,表现形式清晰.形象,操作简单而深受用户喜爱.而且用它可以实现ListView.ListBox所无法实现的很多功能 ...
- 在delphi中执行javascript代码
有时做项目难免用到代码交叉调用,delphi中执行js就是一种,两种方法可用: 一.使用webbrower,比较麻烦 二.使用ScriptControl,简单方便: 1.首先 uses ComObj; ...
- 浅解析js中的对象
浅解析js中的对象 原文网址:http://www.cnblogs.com/foodoir/p/5971686.html,转载请注明出处. 前面的话: 说到对象,我首先想到的是每到过年过节见长辈的时候 ...
- 关于 Delphi 中的Sender和易混淆的概念(转)
/////////////////////////////////////////////////////// Delphi 中Sender对象的定义///////////////////////// ...
随机推荐
- zookeeper 客户端操作
代码 /** * 创建zk客户端 * 实现循环监听的两个必要条件:1.程序不能结束2.递归调用监听器 * @author tele * */ public class Demo { ; //多个节点用 ...
- vultr的80端口?
1.查看防火墙版本号firewall-cmd --version2.查看防火墙状态firewall-cmd --state3.添加80端口的权限firewall-cmd --zone=public - ...
- laravel routes除了默认路由,其他的都无效 解决方案
按照教程.该php升级到5.5,所有是开放的扩展,默认路由进入,证明代码错误,平时不开rewrite铅 假设你其它路由,localhost/文件夹/public/index.php/home能够进去. ...
- 面试问题:Vista与XP的Session 0与Session X的区别
面试问题:Vista与XP的Session 0与Session X的区别 在XXXXX的一次面试中,笔试问题的题目曾提到Session 0.Session 1在Vista和Xp中的区别?现在把答案发上 ...
- 学术论文写作的 paper、code 资源
(机器学习/计算机视觉/深度学习)代码 0. 核心期刊 Best paper awards at - CV NIPS: JMLR COLT & ICML(每年度的官网) 1. Computin ...
- QWidget居中显示(qt窗口坐标原点是在”左上角”的,有图)
转载请说明出处, 并附上原文链接http://blog.csdn.net/qq907482638/article/details/72189014. 问题描述 在Qt学习过程中,在让QDialog居中 ...
- 两个QWidget叠加,可部分代替layout的功能
在QT开发过程中,有时候会遇到这样的问题,当我们自己创建了一个Layout对象以后,使用QWidget的setLayout方法,将这个Layout对象应用到窗口中的时候,发现窗口上没有我们添加的控件, ...
- matlab 高阶(一) —— assignin与evalin
1. assignin assignin(ws, 'var', val) 将 val 值赋值给 ws 空间中的 var 变量,注意这里的变量,必须是 array 类型,而不可以是包含下标索引,如果在指 ...
- python实现简易采集爬虫
#!/usr/bin/python #-*-coding:utf-8-*- # 简易采集爬虫 # 1.采集Yahoo!Answers,parseData函数修改一下,可以采集任何网站 # 2.需要sq ...
- Hibernate_12_HQL句子
使用HQL查询功能: (1)与SQL相似,SQL用. (2)SQL查询的是表和表中的列.HQL查询的是对象与对象中的属 (3)HQL的keyword不区分大写和小写,类名与属性名是区分大写和小写 (4 ...