中国程序员联盟 正在重新改版中ing 不便之处还请见谅 改版后将内容涉及java delphi .net php
 
  首页 | 数据库开发 | 网络通讯 | 多线程 | 多媒体开发 | 图像处理 | 程序人生 | 系统函数 | 控件开发 | Web服务
 
  当前位置:笨鱼delphi技术网>系统函数>文章内容

delphi Win32 API 使用的特殊情况

来源:站内 关于:bill 发布时间:2007-06-27   [收藏] [推荐]
我个人认为,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.

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


[浏览: 次]   
上一篇:delphi 如何使用API   下一篇:delphi API函数开发三原则
[收藏] [推荐] [返回顶部] [打印本页] [关闭窗口]  
    评论加载中…
google adsense热点文章
·delphi Delphi中ShellExecute的妙用
·delphi 如何快速读取文本文件
·delphi 在应用层截获键盘消息
·delphi 如何判断输入值是否中文
·delphi delphi实现服务开启与关闭
·delphi 实时记录事件日志
·delphi 使MEMO自动滚动
·delphi 如何区分键盘两个Enter键
·delphi 切换界面的方法
·delphi 汉字输入法的编程及使用
·delphi Delphi程序输入法自动切换最简
·delphi 消息是由谁来发出又由谁来完成
     delphi技术网 | firefox 下载 | Avant Browser下载 | dedecms 技术网 | drupal 爱好者 | php 技术网
  Copyright@www.delphichm.com,2006-2009.All Rights Reserved.
 
程序员联盟 | delphi Java .net|QQ:707102932