Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> версия windows в директиве 
:(
    Опции темы
gonzales
Дата 19.11.2012, 17:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 241
Регистрация: 13.3.2006

Репутация: 1
Всего: 2



Доброго времени суток, уважаемые форумчане! Возник вопрос по директивам компилятора
Имеется константа описанная
Код

{$IFDEF GDIP_0110}

const
  GDIPVER = $0110;

{$ELSE}

const
  GDIPVER = $0100;
{$ENDIF}


В данном примере проверяется значение $IFDEF
А можно ли проверять версию windows? 
Getversion просьба не предлагать

Это сообщение отредактировал(а) gonzales - 19.11.2012, 17:09
--------------------
- мастер, мастер, запорол..., все четыре запорол!!!- я ж тебе только три давал!!!???- да я и образец запорол!!!!
PM MAIL   Вверх
Alexeis
Дата 19.11.2012, 17:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



  Полный список предопределенных констант тут http://docwiki.embarcadero.com/RADStudio/X...edefined_Macros

  На самом деле можно определить только Windows ли это или Мак.

  Если захотеть и сильно выкрутиться можно попробовать накрутить что-то с шаблонами, так чтобы Getversion вызывалась еще компилятором. Но не уверен получиться ли.

  Можно попробовать написать небольшую программу, которая будет вызываться перед компиляцией проекта, проверит версию ОС и создаст заголовочный файл с нужным дефайном. Этот заголовок будет включаться в проект.

Это сообщение отредактировал(а) Alexeis - 19.11.2012, 17:55


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
northener
Дата 20.11.2012, 00:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1361
Регистрация: 2.9.2010

Репутация: 8
Всего: 20



Цитата(gonzales @  19.11.2012,  17:09 Найти цитируемый пост)
В данном примере проверяется значение $IFDEF

В данном примере проверяется то, что известно уже на этапе компиляции. А именно есть ли в списке Conditional Defines условие GDIP_0110.

Цитата(gonzales @  19.11.2012,  17:09 Найти цитируемый пост)
А можно ли проверять версию windows?

На этапе компиляции проекта или во время выполнения программы?
Если первое, то нафига это нужно? 
Если второе, то может поможет/подойдёт  Смотри ответ Юрия Зотова на ДМ.

Добавлено через 7 минут и 31 секунду
Цитата(Alexeis @  19.11.2012,  17:27 Найти цитируемый пост)
На самом деле можно определить только Windows ли это или Мак.

И только в ХЕ3.
Может где-то в исходниках завалялось ещё и определение линукса. 
Самому лень искать в Д6 smile

Это сообщение отредактировал(а) northener - 20.11.2012, 00:13


--------------------
Но только лошади летают вдохновенно.
Иначе лошади разбились бы мгновенно!
PM MAIL   Вверх
gonzales
Дата 20.11.2012, 09:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 241
Регистрация: 13.3.2006

Репутация: 1
Всего: 2



Цитата

Можно попробовать написать небольшую программу, которая будет вызываться перед компиляцией проекта, проверит версию ОС и создаст заголовочный файл с нужным дефайном. Этот заголовок будет включаться в проект.


Идея в принципе интересная.

а как запустить программу на этапе компиляции? сорри, если спрашиваю простые вещи

Цитата

На этапе компиляции проекта или во время выполнения программы?
Если первое, то нафига это нужно? 

Потому что есть например такая конструкция
Код

type
  TGPSmoothingMode = (SmoothingModeInvalid = Ord(QualityModeInvalid), SmoothingModeDefault = Ord(QualityModeDefault),
    SmoothingModeHighSpeed = Ord(QualityModeLow), SmoothingModeHighQuality = Ord(QualityModeHigh), SmoothingModeNone, SmoothingModeAntiAlias
{$IF (GDIPVER >= $0110)}
    , SmoothingModeAntiAlias8x4 = Ord(SmoothingModeAntiAlias), SmoothingModeAntiAlias8x8
{$IFEND}
    );


Открыл юнит winapi.windows, нашел интересные вещи
Код

unit Winapi.Windows;

{$ALIGN ON}
{$MINENUMSIZE 4}
{$WEAKPACKAGEUNIT}
{$IFDEF LINUX}
{$DEFINE LINUXCRITSECTION}
{$ENDIF}

 { _WIN32_WINNT > 0x0400 || !defined(_WIN32_WINNT) }
 { _WIN32_WINNT >= 0x0501 }
 { _WIN32_WINNT >= 0x0600 }

interface

uses System.Types, System.UITypes{$IFDEF LINUX}, Libc {$ENDIF};

(*$HPPEMIT '// WINVER check BEGIN ' *)
(*$HPPEMIT '#if (WINVER < 0x0400)' *)
(*$HPPEMIT '  #error WINVER < 0x0400' *)
(*$HPPEMIT '#endif' *)
(*$HPPEMIT '// WINVER check END. ' *)
(*$HPPEMIT '' *)

_WIN32_WINNT - это не то? 



Это сообщение отредактировал(а) gonzales - 20.11.2012, 10:00
--------------------
- мастер, мастер, запорол..., все четыре запорол!!!- я ж тебе только три давал!!!???- да я и образец запорол!!!!
PM MAIL   Вверх
bems
Дата 20.11.2012, 12:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 31
Всего: 88



Если тебе нужно компилировать разные экзешники для разных версий винды, то создай по конфигурации для разных версий, и в каждой конфигурации определи свой дефайн


--------------------
Обижено школьников: 8
PM MAIL   Вверх
gonzales
Дата 21.11.2012, 10:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 241
Регистрация: 13.3.2006

Репутация: 1
Всего: 2



Цитата

Если тебе нужно компилировать разные экзешники для разных версий винды, то создай по конфигурации для разных версий, и в каждой конфигурации определи свой дефайн

именно это и надо. вопрос, сам ехе-шник при этом будет один, или все равно будет их два?
--------------------
- мастер, мастер, запорол..., все четыре запорол!!!- я ж тебе только три давал!!!???- да я и образец запорол!!!!
PM MAIL   Вверх
bems
Дата 21.11.2012, 14:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 31
Всего: 88



в каждой конфигурации свой будет


--------------------
Обижено школьников: 8
PM MAIL   Вверх
Alexeis
Дата 21.11.2012, 19:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Цитата(gonzales @  20.11.2012,  10:56 Найти цитируемый пост)
а как запустить программу на этапе компиляции? сорри, если спрашиваю простые вещи

  Насколько я помню тут настраивается http://ybex.com/d/00ks6ohxufhnrichwue74o6a...devk0dwfh5.html


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
bems
Дата 21.11.2012, 19:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 31
Всего: 88



Цитата(gonzales @  20.11.2012,  09:56 Найти цитируемый пост)
а как запустить программу на этапе компиляции?

ты действительно хочешь чтобы для получения экзешников предназначенных для разных версий тебе нужно было загружать другую версию? всё же можно компилировать на одной

Цитата(gonzales @  20.11.2012,  09:56 Найти цитируемый пост)
Потому что есть например такая конструкция

это не повод держать несколько экзешников. тут лучше сделать проверку в рантайм


--------------------
Обижено школьников: 8
PM MAIL   Вверх
Alexeis
Дата 21.11.2012, 21:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



  Вообще, да обычно проверяют сначала есть ли все необходимые фичи в винде. Если есть, то юзают, если нет либо заменяют своим, либо не используют если это возможно.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
gonzales
Дата 22.11.2012, 10:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 241
Регистрация: 13.3.2006

Репутация: 1
Всего: 2



может я не совсем правильно выражаю свои мысли))))
объясню суть проблемы. Есть системная библиотека gdiplus.dll. В XP используется своя версия, в 7 и Висте - своя, с расширенным функционалом.
Есть заголовочный файл для работы с библиотекой, http://www.bilsen.com/gdiplus/index.shtml
Все доп. возможности определяются константой GDIPVER, которая определяется из содержания Conditional defines.

Цитата

Version 1.1 of GDI+ adds some extra functionality to the original GDI+ version, most notably the addition of bitmap effects. Unfortunately, GDI+ 1.1 is only available on Windows Vista and later, or on computers with a certain version of Office (like Office 2007). Furthermore, the 1.1 version is not redistributable, so you are not allowed to deploy it with your application. However, you are free to use it if it is installed on a computer.

For these reasons, the GDI+ 1.1 extensions are disabled by default. To enable the functionality, you need to do the following in you Delphi application:
Declare the conditional define 'GDIP_0110' (Project Options | Delphi Compiler | Conditional defines). This way, you don't accidentally use GDI+ 1.1 functionality in an application that must run on older versions of Windows.
Disable runtime themes (Project Options | Application, uncheck 'Enable runtime themes'). This will not actually disable runtime themes, because the 'GDIP_0110' define causes the inclusion of different manifest file that enables both runtime themes and GDI+ 1.1.

These steps are required because the GDI+ 1.1 functionality can only be enabled by adding a side-by-side execution entry to you application manifest file. It is not sufficient to add the GDI+ 1.1 DLL to you application directory. When 'GDIP_0110' is defined, a different manifest is compiled into your application (see the GdiPlus11.manifest file for the details). This manifest enables both runtime themes (by using the Common Controls version 6) and GDI+ 1.1 (by using the 1.1 version of the GDI+ DLL).

Note however, that once you use this conditional define, that your application will not run on computers that do not have GDI+ 1.1 installed.


Соответственно для компиляции проекта под ХР необходимо переопределить Conditional defines. 
В рантайме я пробывал определять версию и не использовать опции расширенной библиотеки, но все равно получаю ошибку "точка входа в библиотеку..... не найдена"
Таким образом единственный выход определять GDIPVER на этапе компиляции, или использовать путь предложенный Alexeis.

Или я чего-то не понимаю? smile 

--------------------
- мастер, мастер, запорол..., все четыре запорол!!!- я ж тебе только три давал!!!???- да я и образец запорол!!!!
PM MAIL   Вверх
northener
Дата 22.11.2012, 14:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1361
Регистрация: 2.9.2010

Репутация: 8
Всего: 20



Таким образом использование/неиспользование conditional define 'GDIP_0110' позволяет вам скомпилировать два варианта ЕХЕ-шника. Один не будет использовать расширенные возможности GDI+ 1.1, но будет работать под любой версией Windows. Второй вариант будет использовать расширенные возможности GDI+ 1.1, но будет работать только под Windows Vista и выше.


--------------------
Но только лошади летают вдохновенно.
Иначе лошади разбились бы мгновенно!
PM MAIL   Вверх
bems
Дата 22.11.2012, 15:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 31
Всего: 88



Цитата(gonzales @  22.11.2012,  10:36 Найти цитируемый пост)
"точка входа в библиотеку..... не найдена"

ну сделай функцию которая есть в только в новой версии delayed и вызывай только когда определяешь что новая версия



--------------------
Обижено школьников: 8
PM MAIL   Вверх
Alexeis
Дата 22.11.2012, 23:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Цитата(gonzales @  22.11.2012,  11:36 Найти цитируемый пост)
В рантайме я пробывал определять версию и не использовать опции расширенной библиотеки, но все равно получаю ошибку "точка входа в библиотеку..... не найдена"

  Просто библиотека линкуется статически. Поэтому и проблемы. Можно проверять присутствие и потом грузить динамически.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
northener
Дата 23.11.2012, 00:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1361
Регистрация: 2.9.2010

Репутация: 8
Всего: 20



Цитата(Alexeis @  22.11.2012,  23:48 Найти цитируемый пост)
  Просто библиотека

Просто эта (данная автору в виде dpk) библиотека недоделана. И не умеет работать в рантайм.


--------------------
Но только лошади летают вдохновенно.
Иначе лошади разбились бы мгновенно!
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0924 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.