Определение архитекуры процессора в OS Windows

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Аватара пользователя
AlphaBlend
постоялец
Сообщения: 207
Зарегистрирован: 22.05.2016 09:13:10

Определение архитекуры процессора в OS Windows

Сообщение AlphaBlend »

понадобилось написать функцию , определяющую 64 или 32 ) На многих форумах откровенно глупые решения , которые в голову бы и мне не пришли ( найти папку Program Files(86) , sysWow64 и так далее ) Логично предположить , что определять архитектуру процессора по наличию тех или иных папок на диске , которые пользователь может создать и программа из-за этого станет работать неверно - глупо . Покопавшись в справке Windows нашлось "переменные среды" . Архитектура там тоже есть ) Кому будет полезно - пользуйтесь на здоровье )

Код: Выделить всё

{$IFDEF MSWINDOWS}
 function BooleanToString(Bool:Boolean):String;
   begin
     if bool then result:='true' else result:='false';
   end;

 { получить разрядность процессора в Windows }

 function GetSystemVolume:Byte;
  var
    Env:AnsiString;
   begin
     Env:=GetEnvironmentVariable('PROCESSOR_ARCHITECTURE');
     if (Env='x86') or (Env = 'x32') or (Env = 'i386') or (Env = 'i686') then result:=32;
     if (Env='x64') or (Env = 'x86_64') then result:=64;
   end;

 { получить корневую папку системы  Windows }

 function GetSystemDir:String;
   begin
     result:=GetEnvironmentVariable('windir');
   end;

 { получить системный диск Windows }

 function GetSystemDisk:String;
   begin
     result:=GetEnvironmentVariable('SystemDrive');
   end;
 {$ENDIF}                                             
Аватара пользователя
runewalsh
энтузиаст
Сообщения: 579
Зарегистрирован: 27.04.2010 00:15:25

Сообщение runewalsh »

Религиозно верный способ — IsWow64Process(GetCurrentProcess, ...) или GetNativeSystemInfo() + PROCESSOR_ARCHITECTURE_AMD64/PROCESSOR_ARCHITECTURE_IA64.
Последний раз редактировалось runewalsh 13.07.2016 16:04:40, всего редактировалось 1 раз.
Аватара пользователя
AlphaBlend
постоялец
Сообщения: 207
Зарегистрирован: 22.05.2016 09:13:10

Сообщение AlphaBlend »

:shock: IsWow64Process() в каком модуле у Лазаруса , не подскажете ? )

Добавлено спустя 2 минуты 25 секунд:
мне показалось , что такое решение будет работать исправно ... Или есть какие-то "дырки" ? подскажите новичку ? ) :|
Аватара пользователя
runewalsh
энтузиаст
Сообщения: 579
Зарегистрирован: 27.04.2010 00:15:25

Сообщение runewalsh »

В модуле LoadLibrary(kernel32) + GetProcAddress :(
Аватара пользователя
AlphaBlend
постоялец
Сообщения: 207
Зарегистрирован: 22.05.2016 09:13:10

Сообщение AlphaBlend »

это WIN API ? )

Добавлено спустя 2 минуты 8 секунд:
подождите-ка ) а разве в windows xp такая библиотечная функция есть ? ( IsWow64Process) Если пользователь захочет на хp запустить приложение , оно же не будет работать .... :roll:
Аватара пользователя
runewalsh
энтузиаст
Сообщения: 579
Зарегистрирован: 27.04.2010 00:15:25

Сообщение runewalsh »

Ну да, что такого, всё равно под ifdef.
>дырки
Как и забракованные тобой папки, переменные среды можно менять:

Код: Выделить всё

set PROCESSOR_ARCHITECTURE=qwerty
echo %PROCESSOR_ARCHITECTURE%

Если функция IsWow64Process вообще не найдена — это 32-bit (и старая система).
Последний раз редактировалось runewalsh 13.07.2016 16:12:31, всего редактировалось 1 раз.
скалогрыз
долгожитель
Сообщения: 1804
Зарегистрирован: 03.09.2008 02:36:48

Сообщение скалогрыз »

AlphaBlend писал(а):подождите-ка ) а разве в windows xp такая библиотечная функция есть ? ( IsWow64Process) Если пользователь захочет на хp запустить приложение , оно же не будет работать ....

на мсдн-е же так и сказали - загружайте динамично. Если функции нет, то значит вы на 32-битной системе.

Код: Выделить всё

program project1;

uses Windows;

function is64bit: Boolean;
type
  TisWow64ProcessProc = function (Handle: THANDLE; var is64: BOOL): BOOL; stdcall;
var
  is64proc: TisWow64ProcessProc;
  res : BOOL;
begin
  res:=false;
  is64proc:= TisWow64ProcessProc( GetProcAddress(GetModuleHandle('kernel32'), 'IsWow64Process'));
  if Assigned(is64proc) then begin
    if not is64proc(GetCurrentProcess, res) then
      res:=false;
  end;
  Result:=res;
end;

begin
  writeln(is64bit);
end.


А зачем знать про 64-битность процессора?
Аватара пользователя
AlphaBlend
постоялец
Сообщения: 207
Зарегистрирован: 22.05.2016 09:13:10

Сообщение AlphaBlend »

скалогрыз тупо скопипастила вот сейчас :mrgreen: :mrgreen: :mrgreen: до меня бы не дошло так сделать )

Добавлено спустя 1 минуту 15 секунд:
спасибо ))))
скалогрыз
долгожитель
Сообщения: 1804
Зарегистрирован: 03.09.2008 02:36:48

Сообщение скалогрыз »

а зачем всё-таки знать про процессор?

Добавлено спустя 27 секунд:
AlphaBlend писал(а):спасибо ))))

runewalsh-у в первую очередь.
Аватара пользователя
AlphaBlend
постоялец
Сообщения: 207
Зарегистрирован: 22.05.2016 09:13:10

Сообщение AlphaBlend »

только boolean , а не bool ) функция работает ) Всем спасибо )

Добавлено спустя 3 минуты 5 секунд:
скалогрыз про процессор надо знать потому что программа должна автоматически копировать только одну библиотеку libmysql.dll с нужной разрядностью ) для охранников программка , которая записывает в базу кто во сколько пришел и во сколько ушел . Сказали написать быстро , а компьютеры на постах разные , вот и задумалась так сделать , чтобы не выковыриваться потом )
SSerge
энтузиаст
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

Сообщение SSerge »

AlphaBlend писал(а): которые пользователь может создать и программа из-за этого станет работать неверно


А у вас на 32-битной машине всё равно не запустится программа, скомпилированная под 64х :idea: Даже определять ничего не надо.
Для иных же целей, не представляю, для чего нужно такое определение, разве что для каталогизации какой-то. Ну так еще и ветка реестра есть, в которой записана модель процессора.

И, кстати, MS вот уже сколько лет считает, что XP больше не существует в природе.
Аватара пользователя
AlphaBlend
постоялец
Сообщения: 207
Зарегистрирован: 22.05.2016 09:13:10

Сообщение AlphaBlend »

а Ваш метод мне потом в дальнейшем пригодится в моем проекте ) Еще раз спасибо ! ) :twisted:
скалогрыз
долгожитель
Сообщения: 1804
Зарегистрирован: 03.09.2008 02:36:48

Сообщение скалогрыз »

AlphaBlend писал(а):про процессор надо знать потому что программа должна автоматически копировать только одну библиотеку libmysql.dll с нужной разрядностью ) для охранников программка , которая записывает в базу кто во сколько пришел и во сколько ушел . Сказали написать быстро , а компьютеры на постах разные , вот и задумалась так сделать , чтобы не выковыриваться потом )

если программа 32-битная, она захочет видеть только 32-битную длл-ку.
Рекомендую писать только 32-битную версию.

Т.к. винда это не линкус, 32-битная программка запустится на 64-битной Винде без проблем. И версия длл-ки понадобится только одна.
Аватара пользователя
AlphaBlend
постоялец
Сообщения: 207
Зарегистрирован: 22.05.2016 09:13:10

Сообщение AlphaBlend »

SSerge писал(а): XP больше не существует в природе

существует ) Охранники линукса не хотят ) Компьютеры старше меня еще , но есть и новые с 7-кой ( купленной ) , 64 . Программа сама не будет работать , мне инсталлятор ее чтобы знал - какую библиотеку копировать и куда ) Там программка-то - три файлика - два окошечка )

Добавлено спустя 1 минуту 36 секунд:
скалогрыз спасибо , тоже буду знать ) просто одну библиотеку на все оставить ? ( туплю , да-да , я с windows редко общаюсь ) :oops: тем более что-то под нее "быстренько сообрази-ка программку" - пишу ))))
скалогрыз
долгожитель
Сообщения: 1804
Зарегистрирован: 03.09.2008 02:36:48

Сообщение скалогрыз »

AlphaBlend писал(а):просто одну библиотеку на все оставить ?

Да, всё только 32-битное и проблем не будет.
Ответить