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;
由于asEnumDynamicTimeZoneInformation
仅在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;只有这样,才能调用导入的例程。你怎么检查?