Вам необходимо использовать GetProcAddress()
для проверки доступности функции IsWow64Process()
во время выполнения, например:
function Is64BitWindows: boolean;
type
TIsWow64Process = function(hProcess: THandle; var Wow64Process: BOOL): BOOL;
stdcall;
var
DLLHandle: THandle;
pIsWow64Process: TIsWow64Process;
IsWow64: BOOL;
begin
Result := False;
DllHandle := LoadLibrary('kernel32.dll');
if DLLHandle <> 0 then begin
pIsWow64Process := GetProcAddress(DLLHandle, 'IsWow64Process');
Result := Assigned(pIsWow64Process)
and pIsWow64Process(GetCurrentProcess, IsWow64) and IsWow64;
FreeLibrary(DLLHandle);
end;
end;
, потому что эта функция доступна только в версиях Windows, которые имеют 64-битную версию. Объявление его как external
не позволит вашему приложению работать в Windows 2000 или Windows XP с пакетом обновления 2 (SP2).
Edit:
Крис опубликовал комментарий о кэшировании результата по соображениям производительности. Это может быть необязательным для данной конкретной функции API, потому что kernel32.dll всегда будет там (и я не могу представить программу, которая даже загружалась бы без нее), но для других функций все может быть иначе , Итак, вот версия, которая кэширует результат функции:
function Is64BitWindows: boolean;
type
TIsWow64Process = function(hProcess: THandle; var Wow64Process: BOOL): BOOL;
stdcall;
var
DLLHandle: THandle;
pIsWow64Process: TIsWow64Process;
const
WasCalled: BOOL = False;
IsWow64: BOOL = False;
begin
if not WasCalled then begin
DllHandle := LoadLibrary('kernel32.dll');
if DLLHandle <> 0 then begin
pIsWow64Process := GetProcAddress(DLLHandle, 'IsWow64Process');
if Assigned(pIsWow64Process) then
pIsWow64Process(GetCurrentProcess, IsWow64);
WasCalled := True;
FreeLibrary(DLLHandle);
end;
end;
Result := IsWow64;
end;
Кэширование результата этой функции безопасно, поскольку функция API будет там или нет, и ее результат не может измениться при той же установке Windows. Даже безопасно вызывать это одновременно из нескольких потоков, так как два потока, которые находят WasCalled
равным False
, будут оба вызывать функцию, записывать один и тот же результат в одну и ту же ячейку памяти и только потом устанавливать WasCalled
в True
.