Delphi 如何声明仅存在于windows 8上的外部函数,而不使应用程序在windows 7及更低版本上崩溃?

Delphi 如何声明仅存在于windows 8上的外部函数,而不使应用程序在windows 7及更低版本上崩溃?,delphi,Delphi,看起来很愚蠢,但它们是声明外部函数的一种方式,如: function EnumDynamicTimeZoneInformation(dwIndex: DWORD; lpTimeZoneInformation: PDynamicTimeZoneInformation): DWORD; stdcall; external advapi32; 由于asEnumDynamicTimeZoneInformation仅在windows 8中可用,因此此声明使应用程序在windows 7及更低版本上崩溃 无

看起来很愚蠢,但它们是声明外部函数的一种方式,如:

function EnumDynamicTimeZoneInformation(dwIndex: DWORD; lpTimeZoneInformation: PDynamicTimeZoneInformation): DWORD; stdcall; external advapi32;
由于as
EnumDynamicTimeZoneInformation
仅在windows 8中可用,因此此声明使应用程序在windows 7及更低版本上崩溃

无法创建过程入口点EnumDynamicTimeZoneInformation 位于动态链接库中


他们无论如何都要声明,即使我们不在应用程序中使用它,此声明也不会使应用程序崩溃。动态加载库,然后获取函数的地址

var
EnumDynamicTimeZoneInformation:函数(dwIndex:DWORD;lpTimeZoneInformation:pdDynamicTimeZoneInformation):DWORD;stdcall;
AdvApiHandle:THandle;
过程LoadEnumDynamicTimeZoneInformation()
开始
如果EnumDynamicTimeZoneInformation=nil
然后开始
AdvApiHandle:=LoadLibrary('advapi32.dll');
如果AdvApiHandle 0
然后EnumDynamicTimeZoneInformation:=GetProcAddress(AdvApiHandle,'EnumDynamicTimeZoneInformation');
结束;
结束;
开始
LoadEnumDynamicTimeZoneInformation();
如果EnumDynamicTimeZoneInformation为零
然后枚举DynamicTimeZoneInformation(…)
else ShowMessage(“无EnumDynamicTimeZoneInformation”);
....
如果AdvApiHandle 0
然后是FreeLibrary(AdvApiHandle);
结束。

在Delphi 2010及更高版本中,您可以在
外部
声明末尾使用,例如:

函数EnumDynamicTimeZoneInformation(dwIndex:DWORD;lpTimeZoneInformation:pdDynamicTimeZoneInformation):DWORD;stdcall;外部advapi32延迟;
delayed
指令可用于修饰外部例程,以延迟加载包含该例程的库。当第一次调用例程时,实际加载发生

当运行应用程序的目标操作系统上不存在导入的例程时,
delayed
指令非常有用。静态导入的例程要求操作系统在应用程序启动时查找并加载库。如果在加载的库中找不到例程,或者库不存在,则操作系统将停止应用程序的执行。使用
delayed
指令可以在运行时检查操作系统是否支持所需的API;只有这样,才能调用导入的例程

例如:

如果选中win32version(6,2),则
开始
枚举动态时区信息(DesiredIndex);
结束;

@TomBrunberg bah no正是declration本身使应用程序crashIn Delphi 2010及更新版本,您也可以使用。
如果AdvApiHandle>=32,则如果AdvApiHandle 0
则需要使用
。“魔法”数字32仅适用于返回假
HINSTANCE
句柄的
ShellExecute()
。32不适用于实际模块句柄。使用延迟指令可以在运行时检查操作系统是否支持所需的API;只有这样,才能调用导入的例程。你怎么检查?