Delphi Win32 API 使用的特殊情况

原创 2001年02月01日 14:13:00

    我个人认为,Delphi 是当今最好的 Windows 可视化开发工具。
其种种特点令开发如虎添翼。但要想发挥出 Delphi 真正的内含性能
比如开发控件,实现一些特殊的功能,就必须直接调用 Win32 API。
Win32 API 主要包含在 Windows95/98/NT/2K 的系统动态连接库中
如 Kernel32.dll、User32.dll、Gdi32.dll、Shell32.dll 等等
    通常情况下 我们只要在代码的 Uses 部分加入 Windows 等单元
的声明即可像使用 Delphi 内置函数一样的使用 Win32 API 函数,十
分方便。
    但是,这样使用有时候会带来一些意想不到的麻烦。具体如下:
众所周知,Windows 的版本十分多,仅 Win95 就有 Win95A,Win95B
等等,而它们对 Win32 API 的实现是有细微差别的,尽管它们都是
Win32 平台。有一些 Win32 API 函数在特定的 Windows 版本中名称有
些许不同,或者根本就是是不存在的。
    这样就带来了问题: Delphi 的 Windows 等单元是与当时最新的
Win32 API 全集对应的,Delphi 在编译的时候总是动态连接 Windows
函数库(所有的 Windows 编译型开发工具都是这样的)。编译时毫无
问题的代码,其可执行文件在特定的 Windows 平台上就无法使用。
    由于 Windows 的可执行文件加载机制,在 Delphi 集成环境中是
无法跟踪这样的潜在问题的。下面举两个例子:
    例一:
   
Win32 API 声明:
    function BroadcastSystemMessage; external user32
       name 'BroadcastSystemMessageA';
    (来自 Delphi 5 Enterprise Windows.pas :29408)
注意,使用这个函数编译后,程序在 Win95 的早期版本中无法使用(
好像是 Win95A)
    将函数声明改为如下后,问题解决:
    function BroadcastSystemMessage; external user32
       name 'BroadcastSystemMessage'; //注意这里!!
    例二:
    Win32 API 声明:
    function SHGetSpecialFolderPath; external shell32
       name 'SHGetSpecialFolderPathA'
    (来自 Delphi 5 Enterprise ShlObj.pas :3333)
注意,使用这个函数编译后,程序在 Win95 某版本中无法使用
(Shell32.dll 版本:4.00.1111),因为这个函数根本就不存在!!
目前我尚无解决方案
    要避免这样的问题的出现,有两个方法:
    一:不直接使用 Win32 API,找第三方控件(这个方法好像是废话)
    二:动态加在函数。方法如下:以 Win2K 中的 AnimateWindow 为例
(关于 AnimateWindow 函数的详细讨论,请到 www.csdn.net 文档,VB
查找关键字 AnimateWindow,感谢: iProgram)

Unit XXXX;
.....
type
   FAnimateWindow = function(
                       const hwnd : HWND;       //仅对窗口有效
                       const dwTime : DWORD;    //动画持续时间,默认200ms
                       const dwFlags : DWORD): DWORD; stdcall;
  
function AnimateWindow(const hWnd : HWND; const dwTime : DWORD;
                       const dwFlags : DWORD): DWORD;

implementation

function AnimateWindow(const hWnd : HWND; const dwTime : DWORD;
                       const dwFlags : DWORD): DWORD;
var
   DLLHandle : THandle;
   AnimateWindow : FAnimateWindow;
begin
   Result := 0;
   DLLHandle := LoadLibrary('user32.dll');
   @AnimateWindow := GetProcAddress(DllHandle,'AnimateWindow');
   Result := AnimateWindow(hWnd, dwTime, dwFlags);
end;

.....
end.

怎么样,是有些麻烦吧,很值的。
    如果你不想让自己的程序挑三拣四,
    如果你不想让自己被称为废物程序员,呵呵,试一下吧。

018_《Delphi下深入Windows核心编程》

本书是一本介绍Windows核心技术及高级技巧的专著。从系统内核编程出发,使用大量的例子帮助读者理解这些编程技术,讲述了线程同步及隐藏、系统钩子深入分析、读写物理磁盘的关键技术、读写物理内存和其他进程...
  • shuaihj
  • shuaihj
  • 2010年11月22日 17:45
  • 2474

delphi调用windows api

在Delphi中调用Windows API 函数十分方便,只需在单元的uses段加入Windows 单元名即可(对于由Delphi自动创建的单元,该项工作已经完成)。单元Windows.pas 已经由...
  • liujiayu2
  • liujiayu2
  • 2017年04月14日 10:54
  • 860

在win32 api程序中:使用C++风格的字符串

        初学win32 api程序设计的人,通常对于C语言的字符串和数字转换感到比较头痛。尤其像我这样只学过C++,却不谙C语言的标准库的人,使用起char*和atoi()来实在是如履薄冰 所...
  • zhaoxiafei
  • zhaoxiafei
  • 2006年06月15日 11:31
  • 1869

WIN32 API写一个窗口

#include #include LRESULT CALLBACK WinSunProc( HWND hwnd, // handle to window UINT uMsg,...
  • Sun19910114
  • Sun19910114
  • 2014年08月23日 17:08
  • 666

Win32 API编程简介Demo程序

Windows编程的方法主要有两种方法,                     传统编写法:利用API函数;                     交互式方法:利用MFC类库。        ...
  • markmin214
  • markmin214
  • 2013年03月29日 11:25
  • 1968

使用 Win32 API 枚举应用程序

概要一个常见的编程任务是枚举所有运行的"应用程序"。Windows 任务管理器就是一个很好的例子。它用两种方式列出"应用程序"。任务管理器的第一个选项卡列出桌面上的所有"应用程序窗口"。第二个选项卡列...
  • qsdnet
  • qsdnet
  • 2005年10月01日 00:57
  • 1777

<Win32 API> 文件操作CreateFile/ReadFile/WriteFile

1. CreateFile/ReadFile/WriteFile CreateFile函数原型: HANDLE CreateFile( LPCTSTR lpFileName, DWORD dw...
  • Meta_Cpp
  • Meta_Cpp
  • 2015年01月07日 15:21
  • 5511

win32 API的互斥量与信号量

信号量(Semaphore)和互斥量一样,属于内核对象。它自动执行可用资源查询的测试,如果有可用资源,则可用资源的计数减少,从而避免其它线程请求资源。当该线程释放该资源后,可用资源计数增加,则操作系统...
  • dingyaguang117
  • dingyaguang117
  • 2012年01月30日 12:45
  • 3207

Win32 API 串口编程

目录 一串口通信基础       1.1串口通信原理与特点      1.2串口通信的传输方式      1.3串口通信的同步技术      1.4串行接口标准      二 API函数实现串口通信 ...
  • changyourmind
  • changyourmind
  • 2016年08月09日 11:22
  • 1636

win32 字体 api学习总结

TrueType字体 TrueType字体,中文名称全真字体,是由Apple公司和Microsoft公司联合提出的一种采用新型数学字形描述技术的计算机字体。它用数学函数描述字体轮廓外形,含有字形构造、...
  • bcbobo21cn
  • bcbobo21cn
  • 2017年06月18日 22:30
  • 820
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Delphi Win32 API 使用的特殊情况
举报原因:
原因补充:

(最多只允许输入30个字)