有很多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的评论来看,似乎标准的做法是重新声明这样的例程.就个人而言,我更喜欢使用标准声明,如果我可以在我自己的个人单位,但出于专业工作的目的,我建议开发人员遵循标准做法.