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

10-05 22:15