-
Собственно можно как-то в Runtime узнать разрядность ОС?
Мне это нужно для того, чтобы в зависимости от разрядности ОС загружать соответствующий драйвер.
-
Пробовал GetVersion, GetVersionEx, GetNativeSystemInfo.
При запуске программы под Windows 7 x64 выдает что платформа 32-разрядная.
-
> в зависимости от разрядности ОС загружать соответствующий драйвер. а программа у тебя сколькиразрядная? "на лету" меняется?
-
16-разрядная ОС вряд ли уже попадётся, а про 64-разрядную из 32-битной программы можно узнать, например, так: function Is64BitWindows: Boolean;
var
IsWow64Process: function(hProcess: THandle; out Wow64Process: Bool): Bool; stdcall;
Wow64Process: Bool;
begin
Result := True;
Result := False;
@IsWow64Process := GetProcAddress(GetModuleHandle('Kernel32.dll'), PAnsiChar('IsWow64Process'));
Wow64Process := False;
if Assigned(IsWow64Process) then
Wow64Process := IsWow64Process(GetCurrentProcess, Wow64Process) and Wow64Process;
Result := Wow64Process;
end;
-
> 16-разрядная ОС вряд ли уже попадётся, а про 64-разрядную > из 32-битной программы можно узнать, например, так:function > Is64BitWindows: Boolean;var IsWow64Process: function(hProcess: > THandle; out Wow64Process: Bool): Bool; stdcall; Wow64Process: > Bool;begin {$IF Defined(CPU64)} Result := True; {$ELSEIF > Defined(CPU16)} Result := False; {$ELSE} @IsWow64Process > := GetProcAddress(GetModuleHandle('Kernel32.dll'), PAnsiChar('IsWow64Process')); > Wow64Process := False; if Assigned(IsWow64Process) then > Wow64Process := IsWow64Process(GetCurrentProcess, Wow64Process) > and Wow64Process; Result := Wow64Process; {$IFEND}end; >
Спасибо
-
> > в зависимости от разрядности ОС загружать соответствующий > драйвер.а программа у тебя сколькиразрядная? "на лету" меняется? >
Сама программа 32х. Драйвер может быть или 32х или 64х. Если попытаться загрузить 32х-разрядный в 64-разрядной ОС, то ничего не получиться.
-
http://www.transl-gunsmoker.ru/2010/02/64-windows.html > Если попытаться загрузить 32х-разрядный в 64-разрядной ОС, > то ничего не получиться.
Это не libpcap ли драйвер часом? А чего 32 разрядный драйвер вообще делает в 64 разрядной ОС? Драйверам положено лежать в папке drivers и попадать туда с инсталлятором.
-
Нет, это не libpcap.
-
> 16-разрядная ОС вряд ли уже попадётся, а про 64-разрядную > из 32-битной программы можно узнать, например, так:function > Is64BitWindows: Boolean;var IsWow64Process: function(hProcess: > THandle; out Wow64Process: Bool): Bool; stdcall; Wow64Process: > Bool;begin {$IF Defined(CPU64)} Result := True; {$ELSEIF > Defined(CPU16)} Result := False; {$ELSE} @IsWow64Process > := GetProcAddress(GetModuleHandle('Kernel32.dll'), PAnsiChar('IsWow64Process')); > Wow64Process := False; if Assigned(IsWow64Process) then > Wow64Process := IsWow64Process(GetCurrentProcess, Wow64Process) > and Wow64Process; Result := Wow64Process; {$IFEND}end; >
Попробовал. Процедура всегда выдает False. Проверено на Windows XP SP3 x86, Windows Vista x86 и x64, Windows 7 x86 и x64.
-
Неофициальный способ: function IsWow64FS: BOOL;
asm
xor eax, eax
cmp fs:[$C0], 0
setne al
end; Официальный способ: function IsWow64: BOOL;
type
TIsWow64Process = function(hProcess: THandle;
var Wow64Process: BOOL): BOOL; stdcall;
var
IsWow64Process: TIsWow64Process;
begin
Result := False;
@IsWow64Process := GetProcAddress(GetModuleHandle(kernel32),
'IsWow64Process');
if Assigned(@IsWow64Process) then
IsWow64Process(GetCurrentProcess, Result);
end;
-
> Rouse_ © (28.12.11 14:35) [9] Нет проверки, что IsWow...(...) выполнилась успешно. И что в неофициальном способе в LongBool пишем единицу, а не стандартный TRUE = -1, тоже не очень хорошо.
-
> Нет проверки, что IsWow...(...) выполнилась успешно.
Есть, но с ньюансом :) Если посмотреть реализацию IsWow то значение параметра в случае неуспеха не изменится и стало быть как и в данном случае http: вернется False > И что в неофициальном способе в LongBool пишем единицу, > а не стандартный TRUE = -1, тоже не очень хорошо.
Стандартный TRUE это не FALSE, с учетом что FALSE равен нулю :) Ну или дай пруфлинк на спецификацию, возможно что я чейто и подзабыл )
-
Были ситуёвины, когда B1 = TRUE, B2 = TRUE, но if B1 = B2 then ... не выполнялось, потому что Byte(B1) <> Byte(B2) :-\ С тех пор стараюсь обращать внимание на такие нюансы.
-
> не выполнялось, потому что
Ну логично, в дан6ном случае, правда я не могу себе представить алгоритм в котором будет выполнятся код по условию как True=True, так и False=False Ну и на -1 переделать конечно легко: function IsWow64FS: BOOL;
asm
xor eax, eax
cmp fs:[$C0], 0
sete al
dec eax
end; но только я все-же категорически не уверен что -1 это правильно, ибо декларация TRUE и FALSE в WinDef.h из SDK выглядит так: #ifndef FALSE
#define FALSE 0
#endif
#ifndef TRUE
#define TRUE 1
#endif
-
> не уверен что -1 это правильно ХЗ... Boolean(True) = 1, ByteBool(True) = WordBool(True) = LongBool(True) = -1. В древней книжке по паскалю говорилось, что "для совместимости с С". Видимо, WinSDK ушёл вперёд, а совместимость в Паскалем осталась. :-)
-
> ByteBool(True) = WordBool(True) = LongBool(True) = -1
А, вот ты про что... Ну тогда да...
|