Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.03.2014, 18:38   #1
beegl
instagram
Участник клуба
 
Аватар для beegl
 
Регистрация: 24.05.2008
Сообщений: 1,453
Стрелка как оформить директиву компилятора Win XP, Win 7, Win 8

привет, подскажи пожалуйста, как оформить директиву компилятора, если Win XP то, если Win 7 то, если Win 8-8.1 то?

примерно так надо: (это пример, для, если х32 то, если х64 то)

Код:
procedure TForm1.Button1Click(Sender: TObject);
begin
{$IFDEF WIN32}
  MessageBox(GetActiveWindow,'Программа совместима с 32-bit Windows','DVpmChecker',MB_OK or MB_ICONINFORMATION);
{$ENDIF}
{$IFDEF WIN64}
  MessageBox(GetActiveWindow,'Программа совместима с 64-bit Windows','DVpmChecker',MB_OK or MB_ICONINFORMATION);
{$ENDIF}
end;
beegl вне форума Ответить с цитированием
Старый 04.03.2014, 18:45   #2
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,442
По умолчанию

Компилятором-никак. Кодом - да, см. класс TOSVersion
Человек_Борща вне форума Ответить с цитированием
Старый 04.03.2014, 18:58   #3
beegl
instagram
Участник клуба
 
Аватар для beegl
 
Регистрация: 24.05.2008
Сообщений: 1,453
По умолчанию

нашел какой-то модуль, подскажите пожалуйста, как оформить одной строчкой, узнать какая ОС????установлена

Код:
unit VersionWin;

interface

uses
  Windows;

const
  VER_NT_WORKSTATION = 0;
  VER_NT_DOMAIN_CONTROLLER = 1;
  VER_NT_SERVER = 2;

  VER_SUITE_SMALLBUSINESS = 1;
  VER_SUITE_ENTERPRISE = 2;
  VER_SUITE_BACKOFFICE = 4;
  VER_SUITE_COMMUNICATIONS = 8;
  VER_SUITE_TERMINAL = $10;
  VER_SUITE_SMALLBUSINESS_RESTRICTED = $20;
  VER_SUITE_EMBEDDEDNT = $40;
  VER_SUITE_DATACENTER = $80;
  VER_SUITE_SINGLEUSERTS = $100;
  VER_SUITE_PERSONAL = $200;
  VER_SUITE_BLADE = $400;

type
  TOsVersionInfoExA = packed record
    old: TOsVersionInfoA;
    wServicePackMajor: Word;
    wServicePackMinor: Word;
    wSuiteMask: Word;
    wProductType: Byte;
    wReserved: Byte;
  end;

function WhatWindowsIsInstalled: string;

implementation

{ Определение типа установленной операционной системы }

function WhatWindowsIsInstalled: string;
var
  VerInfo: TOsVersionInfoExA;
begin
  FillChar(VerInfo, sizeof(VerInfo), 0);
  VerInfo.old.dwOSVersionInfoSize := Sizeof(TOsVersionInfoExA);
  if not GetVersionExA(VerInfo.old) then
  begin
    VerInfo.old.dwOSVersionInfoSize := Sizeof(TOsVersionInfoA);
    GetVersionExA(VerInfo.old);
  end;
  case VerInfo.old.dwPlatformId of
    VER_PLATFORM_WIN32_WINDOWS:
      if (Verinfo.old.dwMajorVersion = 4) and
        (Verinfo.old.dwBuildNumber = 950) then
        Result := 'Windows 95'
      else if (Verinfo.old.dwMajorVersion = 4) and
        (Verinfo.old.dwMinorVersion = 10) and
        (Verinfo.old.dwBuildNumber = 1998) then
        Result := 'Windows 98'
      else if (Verinfo.old.dwMinorVersion = 90) then
        Result := 'Windows Me';
    VER_PLATFORM_WIN32_NT:
      if Verinfo.old.dwMajorVersion = 3 then
        Result := 'Windows NT 3.51'
      else if Verinfo.old.dwMajorVersion = 4 then
        Result := 'Windows NT 4.0'
      else if Verinfo.old.dwMajorVersion = 5 then
        if Verinfo.old.dwMinorVersion = 0 then
          Result := 'Windows 2000'
        else if Verinfo.old.dwMinorVersion = 1 then
          Result := 'Windows XP';
    VER_PLATFORM_WIN32s:
      Result := 'Win32s';
  end;
end;
end.
{Пример использования:
procedure TfrmMain.FormCreate(Sender: TObject);
begin
  WindowsTypeEdit.Text := WhatWindowsIsInstalled();
end;}

Последний раз редактировалось beegl; 04.03.2014 в 19:47. Причина: добавил текст
beegl вне форума Ответить с цитированием
Старый 04.03.2014, 21:36   #4
blackstrip
Форумчанин
 
Аватар для blackstrip
 
Регистрация: 21.01.2012
Сообщений: 240
По умолчанию

Подобные директивы компилятора - они важны на стадии компиляции. Если потом программа уйдет к Васе в виде дистрибутива (готового exe или exe внутри программы установки), а то у него она будет пытаться работать по правилам, которые были ранее сформированы на компе автора программы (когда автор собирал exe-шник). Директивы хороши если исходники распространять, делая свой код работающим в разных системах, и если Вася будет компилировать у себя на компе этот код - то у него скомпилятся и соберутся в exe только те части, которые подходят для васиного компа и васиной ОС.

А проверка версии Windows в приведенному коде делает вызов windows API-функции GetVersionExA(). А потом по полученному номеру узнает тип операционной системы. Например, моя Windows 8.1 это 6.3.9600 (легко это узнать если в любой windows-программе типа блокнота, калькулятора, паинта и т.д. тыкнуть Справка-О программе).

А список всех версий windows и соответствующих им номеров - например, здесь: http://ru.wikipedia.org/wiki/Windows (в разделе "Семейство Windows NT" начиная с 2000 и далее).

Последний раз редактировалось blackstrip; 04.03.2014 в 21:39.
blackstrip вне форума Ответить с цитированием
Старый 04.03.2014, 22:24   #5
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,442
По умолчанию

Ну сказал же по TOSVersion в RTL Delphi, зачем сетевой шлак брать?
Человек_Борща вне форума Ответить с цитированием
Старый 05.03.2014, 08:48   #6
beegl
instagram
Участник клуба
 
Аватар для beegl
 
Регистрация: 24.05.2008
Сообщений: 1,453
Вопрос

Цитата:
Сообщение от blackstrip Посмотреть сообщение
А проверка версии Windows в приведенному коде делает вызов windows API-функции GetVersionExA().
напишите пример, как оформить GetVersionExA(), чтобб результат вывести на Label1.Caption

Код:
procedure TForm1.Button2Click(Sender: TObject);
var
   lpVersionInf: TOSVersionInfo;
begin
Label1.Caption := ..... ;
GetVersionExA(lpVersionInf);
.........
beegl вне форума Ответить с цитированием
Старый 05.03.2014, 09:27   #7
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

в SysUtils есть процедура InitPlatformId. В ней и смотри вызов GetVersionEx. Которую нет необходимости вызывать, поскольку вся необходимая инфа уже есть в глобальных переменных Win32Platform и подобных того же юнита
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 05.03.2014, 12:25   #8
beegl
instagram
Участник клуба
 
Аватар для beegl
 
Регистрация: 24.05.2008
Сообщений: 1,453
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
в SysUtils есть процедура InitPlatformId. В ней и смотри вызов GetVersionEx. Которую нет необходимости вызывать, поскольку вся необходимая инфа уже есть в глобальных переменных Win32Platform и подобных того же юнита
как вывести результат InitPlatformId на Label1.Caption ??


И вот, хотел протестить прогу, на VM VirtualBox, поставил 8-ю, настроил ЮСБ флешку, определяет, только с ошибкой, в диспетчере такая ошибка. Как исправить?


Последний раз редактировалось beegl; 05.03.2014 в 12:32. Причина: добавил текст
beegl вне форума Ответить с цитированием
Старый 05.03.2014, 12:38   #9
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
поскольку вся необходимая инфа уже есть в глобальных переменных Win32Platform и подобных того же юнита
000000000000
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 05.03.2014, 12:47   #10
beegl
instagram
Участник клуба
 
Аватар для beegl
 
Регистрация: 24.05.2008
Сообщений: 1,453
По умолчанию

это если XP, а для 7-й и 8-й какие цифры надо?

Код:
 else if Verinfo.old.dwMajorVersion = 5 then
        if Verinfo.old.dwMinorVersion = 0 then
          Result := 'Windows 2000'
        else if Verinfo.old.dwMinorVersion = 1 then
          Result := 'Windows XP';
beegl вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема совместимости Win XP и Win 2000 при взаимодействии с консолью. maleziv Win Api 10 06.08.2012 22:35
Как сохранить проект VB написанный на win XP , чтобы он работал на win NT Vceznayka Microsoft Office Excel 1 08.02.2012 13:23
висне сет при запуску Win XP после установки Win 7 VVkSoft Windows 3 15.09.2009 10:36
пути в реестре, где находятся программы автозагрузки для win'95 win'98 win' me win 2000 Prisian Win Api 1 11.09.2007 20:07
ветви в реестре для автозагрузки для win'95, win'98, win' me, win 2000 Prisian Windows 1 09.09.2007 23:15