加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

delphi – 如何将nil传递给var参数?

发布时间:2020-12-15 04:09:20 所属栏目:大数据 来源:网络整理
导读:有很多API例程将指向某个变量的指针作为转换为var参数的参数,但可以根据 Windows帮助文件指定为nil指针. 例如,ChangeDisplaySettings函数声明为: function ChangeDisplaySettings(var lpDevMode: TDeviceMode; dwFlags: DWORD): Longint; stdcall; 但Window
有很多API例程将指向某个变量的指针作为转换为var参数的参数,但可以根据 Windows帮助文件指定为nil指针.

例如,ChangeDisplaySettings函数声明为:

function ChangeDisplaySettings(var lpDevMode: TDeviceMode; dwFlags: DWORD): Longint; stdcall;

但Windows帮助文件明确指出“在动态模式更改后,为lpDevMode参数传递NULL是返回默认模式的最简单方法.”正确的翻译应该是:

function ChangeDisplaySettings(lpDevMode: PDeviceMode; dwFlags: DWORD): Longint; stdcall;

我发布这个问题和答案,以帮助新手解决这些问题,而无需重新声明功能.我还记得在开始时这对我来说是一个问题.

解决方法

一种解决方案是使用指针代替var参数重新声明任何此类函数,但有一个更简单的解决方案.只需将解除引用的nil指针强制转换为正确的类型,例如,对于ChangeDisplaySettings示例,使用以下命令将显示模式重置为默认注册表设置:
ChangeDisplaySettings(TDeviceMode(nil^),0);

要么

ChangeDisplaySettings(PDeviceMode(nil)^,0);

这样你传递一个恰好位于内存地址为零的var参数 – 编译器很高兴你可以将一个nil指针传递给API例程!

编辑:从David Hefferman的评论来看,似乎标准的做法是重新声明这样的例程.就个人而言,我更喜欢使用标准声明,如果我可以在我自己的个人单位,但出于专业工作的目的,我建议开发人员遵循标准做法.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读