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

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

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

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

Сообщение AlphaBlend » 13.07.2016 16:38:10

понадобилось написать функцию , определяющую 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}                                             
Аватара пользователя
AlphaBlend
постоялец
 
Сообщения: 207
Зарегистрирован: 22.05.2016 10:13:10

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

Сообщение runewalsh » 13.07.2016 17:02:26

Религиозно верный способ — IsWow64Process(GetCurrentProcess, ...) или GetNativeSystemInfo() + PROCESSOR_ARCHITECTURE_AMD64/PROCESSOR_ARCHITECTURE_IA64.
Последний раз редактировалось runewalsh 13.07.2016 17:04:40, всего редактировалось 1 раз.
Аватара пользователя
runewalsh
энтузиаст
 
Сообщения: 579
Зарегистрирован: 27.04.2010 00:15:25

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

Сообщение AlphaBlend » 13.07.2016 17:04:24

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

Добавлено спустя 2 минуты 25 секунд:
мне показалось , что такое решение будет работать исправно ... Или есть какие-то "дырки" ? подскажите новичку ? ) :|
Аватара пользователя
AlphaBlend
постоялец
 
Сообщения: 207
Зарегистрирован: 22.05.2016 10:13:10

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

Сообщение runewalsh » 13.07.2016 17:07:53

В модуле LoadLibrary(kernel32) + GetProcAddress :(
Аватара пользователя
runewalsh
энтузиаст
 
Сообщения: 579
Зарегистрирован: 27.04.2010 00:15:25

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

Сообщение AlphaBlend » 13.07.2016 17:08:42

это WIN API ? )

Добавлено спустя 2 минуты 8 секунд:
подождите-ка ) а разве в windows xp такая библиотечная функция есть ? ( IsWow64Process) Если пользователь захочет на хp запустить приложение , оно же не будет работать .... :roll:
Аватара пользователя
AlphaBlend
постоялец
 
Сообщения: 207
Зарегистрирован: 22.05.2016 10:13:10

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

Сообщение runewalsh » 13.07.2016 17:11:52

Ну да, что такого, всё равно под ifdef.
>дырки
Как и забракованные тобой папки, переменные среды можно менять:
Код: Выделить всё
set PROCESSOR_ARCHITECTURE=qwerty
echo %PROCESSOR_ARCHITECTURE%

Если функция IsWow64Process вообще не найдена — это 32-bit (и старая система).
Последний раз редактировалось runewalsh 13.07.2016 17:12:31, всего редактировалось 1 раз.
Аватара пользователя
runewalsh
энтузиаст
 
Сообщения: 579
Зарегистрирован: 27.04.2010 00:15:25

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

Сообщение скалогрыз » 13.07.2016 17:12:31

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-битность процессора?
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

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

Сообщение AlphaBlend » 13.07.2016 17:15:32

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

Добавлено спустя 1 минуту 15 секунд:
спасибо ))))
Аватара пользователя
AlphaBlend
постоялец
 
Сообщения: 207
Зарегистрирован: 22.05.2016 10:13:10

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

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

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

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

runewalsh-у в первую очередь.
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

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

Сообщение AlphaBlend » 13.07.2016 17:20:35

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

Добавлено спустя 3 минуты 5 секунд:
скалогрыз про процессор надо знать потому что программа должна автоматически копировать только одну библиотеку libmysql.dll с нужной разрядностью ) для охранников программка , которая записывает в базу кто во сколько пришел и во сколько ушел . Сказали написать быстро , а компьютеры на постах разные , вот и задумалась так сделать , чтобы не выковыриваться потом )
Аватара пользователя
AlphaBlend
постоялец
 
Сообщения: 207
Зарегистрирован: 22.05.2016 10:13:10

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

Сообщение SSerge » 13.07.2016 17:23:54

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


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

И, кстати, MS вот уже сколько лет считает, что XP больше не существует в природе.
SSerge
энтузиаст
 
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

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

Сообщение AlphaBlend » 13.07.2016 17:24:53

а Ваш метод мне потом в дальнейшем пригодится в моем проекте ) Еще раз спасибо ! ) :twisted:
Аватара пользователя
AlphaBlend
постоялец
 
Сообщения: 207
Зарегистрирован: 22.05.2016 10:13:10

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

Сообщение скалогрыз » 13.07.2016 17:26:25

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

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

Т.к. винда это не линкус, 32-битная программка запустится на 64-битной Винде без проблем. И версия длл-ки понадобится только одна.
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

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

Сообщение AlphaBlend » 13.07.2016 17:27:54

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

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

Добавлено спустя 1 минуту 36 секунд:
скалогрыз спасибо , тоже буду знать ) просто одну библиотеку на все оставить ? ( туплю , да-да , я с windows редко общаюсь ) :oops: тем более что-то под нее "быстренько сообрази-ка программку" - пишу ))))
Аватара пользователя
AlphaBlend
постоялец
 
Сообщения: 207
Зарегистрирован: 22.05.2016 10:13:10

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

Сообщение скалогрыз » 13.07.2016 17:33:54

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

Да, всё только 32-битное и проблем не будет.
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

След.

Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot] и гости: 233

Рейтинг@Mail.ru