пятница, 23 октября 2009 г.

Компьютеру надо верить.

Скачал как-то я 64-битную версию Windows7 c Technet, чтобы проверить работоспособность своих приложений. Признаюсь: за рутиной никак не доходили руки почитать про особенности 64-х разрядных систем, поэтому в этих вопросах я плаваю основательно, и наличие огромных граблей в работе программы меня совсем не удивило. Будь я титаном, непременно бы догадался о причинах появления этого садового инструмента. А я в начале впал в ступор, потом не верил своим глазам, и лишь потом взял чашечку кофе и начал просветлятся. Но обо всем по порядку.

Есть у меня модуль, которые проверяет цифровые подписи драйверов. Обычный такой среднестатистический модуль килобайт на 50. В общем, ничего примечательного. Тестекйз этого модуля под win64 падал в разных местах с удивительными для меня эффектами. Подробное изучение происходящего привело меня к причине ошибочного поведения - функции FileExists(). Она никак не хотела видеть модули, находящиеся в системном каталоге windows\system32\drivers. Причем, если скопировать, например, из отладчика путь к модулю C:\Windows\System32\drivers\acpi.sys и выполнить его в командной строке - все работает. Из программы - фигвам. Первое, что приходит в голову, это то, что глючит рабочая лошадка - FileExists. Тут же были испробованы альтернативные способы добраться до файлов, но результат был стабилен и одинаков - такого драйвера в каталоге нет. Да и эксперименты с параметрами функции показали, что проблема только с системными каталогами. Тут я вспомнил слова одного моего товарища: "Компьютеру надо верить!" Если он говорит, что нет файла значит его там действительно нет. А то, что FAR видит этот файл - так это проблемы FAR-а. Далее я легким движением руки программно получил список содержимого каталога C:\Windows\System32\drivers\ и пришел к выводу, что передо мной на самом деле каталог C:\Windows\SysWOW64\drivers\. Там действительно файла acpi.sys нет - налицо транспарентная подмена системных папок, что в новых поколениях Windows на каждом шагу. В качестве дальнейшего источника просветления я выбрал MSDN, где нашел статейку и нужные функции. Так родился скупой, как мужская слеза, код:

function DisableRedirection(out Value: Pointer): Boolean;
const
  DIS_ALIAS = 'Wow64DisableWow64FsRedirection';
type
  TDisableRedirectionFunc = function(OldValue: Pointer): Boolean; stdcall;
var
  DisRedir: TDisableRedirectionFunc;
begin
  @DisRedir := GetProcAddress(GetModuleHandle(kernel32), DIS_ALIAS);

  if Assigned(DisRedir) then
    Result := DisRedir(@Value)
  else
    Result := False;
end;

function EnableRedirection(Value: Pointer): Boolean;
const
  REVERT_ALIAS = 'Wow64RevertWow64FsRedirection';
type
  TRevertRedirectionFunc = function(OldValue: Pointer): Boolean; stdcall;
var
  RevRedir: TRevertRedirectionFunc;
begin
  @RevRedir := GetProcAddress(GetModuleHandle(kernel32), REVERT_ALIAS);

  if Assigned(RevRedir) then
    Result := RevRedir(@Value)
  else
    Result := False;
end;

Ну и напоследок несколько комментариев:

- Использовать эти подпорки следует с осторожностью и четко понимая, зачем это нужно. Выключив подмену, вы отрезаете себе путь к загрузке любой системной 32-х разрядной библиотеки.

- Как видно из документации, управление редиректом осуществляется только в вызывающем потоке. Этим можно воспользоваться.

- 64-х разрядного компилятора мы ждем 3-ий год. Видимо, известная поговорка опять сработала. Пока что придется довольствоваться WOW- песочницей. Про FreePascal на нынешнем этапе жизненного пути я думать боюсь.

- В каталоге system32 лежат 64-х разрядные компоненты, в SysWOW64 - 32-х разрядные. Изрядная путаница в названиях не должна смущать настоящего windows-разработчика. Путаница - это священная традиция, без которой создание программ под windows попросту невозможно.

понедельник, 19 октября 2009 г.

Снова про диаграммы...

Повертел я редактор диаграмм в Delphi 2010. Видно, что с ним поработали: добавились разные незначительные фишки, слегка изменился внешний вид. В целом стало  существенно стабильнее и быстрее. Тем не менее, всё ещё периодически генерится некомпилируемый код, идентификаторы блуждают по исходнякам, есть много мелких замечаний по юзабилити. В частности, непонятно, зачем лицезреть в инспекторе объектов кучу всяких бесполезных свойств диаграммы класса вроде Gradient Color 1, Gradient Color 2 и т.д. Их там добрых 50%, и за ними хорошо умеют прятаться нужные свойства. Или вот: пользовательские свойства диаграммы видны в инспекторе объектов, но поменять их там нельзя - только через специальный редактор или в исходном коде.


Мои попытки получить документацию по диаграмме в нужном мне виде потерпели фиаско. Ну не понимает генератор документации управляющие конструкции с тремя слешами. Тогда я решил почитать локальный хелп - может я что-то не так делаю. В ответ добрая система отправила меня на сайт Эмбаркадеро и предложила мне самому что-нибудь черкнуть на эту тему в доковике. Хех. Прикольно. Этакий хелп 2.0.

Как говаривал Билл Гейтс: "Значит нам есть ещё над чем работать..."

Обидно. 5-ый релиз уже. Складывается стойкое ощущение, что направление LiveSource + Together факультативное, и работают с ним по остаточному принципу.

среда, 7 октября 2009 г.

Манифест некоммунистической партии.

Категорически приветствую вас, уважаемые коллеги!

Наконец-то(!) появилось время что-нибудь черкнуть не только на языке компьютера и не для компьютера =).
Два больших и интересных проекта поглотили меня с головой. Возможно, как-нибудь расскажу и о них. Тем более, там есть о чем поведать... Но сегодня я хотел поговорить о другом. На днях столкнулся с проблемой, которая помимо ассоциации со знаменитым трудом Карла Генриха Маркса и Фридриха непоймикого Энгельса привела меня в замешательство. Есть у меня один проект, работа которого под правильными операционными системами не возможна без запроса определенных прав.
Для получения этих прав в манифесте, находящемся в ресурсах приложения, необходимо указать начальный уровень привилегий. Подробно об этом можно прочитать на MSDN или в новом блоге Александра Божко.
Надо отметить, что ранее (в D2007) особых проблем с манифестами не было, так как они добавлялись руками трудолюбивых разработчиков. Теперь же, в эпоху тотально автоматизации создатели передовой IDE решили помочь разработчикам, избавив их от рутинной работы. Тепрь D2010 сама прикрутит за вас манифест со своими параметрами, изменить которые в проекте нет никакой возможности. Прямо как в том мультфильме:
— Так вы что, и конфеты за меня есть будете?!.. — АГА!!!

Сами создатели, дай им бог крепкого здоровья, маленькую галочку в настройках непременно сделают. По крайней мере я на это очень надеюсь. Пока же единственным способом родить правильный файл является замена ресурса в собранном приложении.

Что ж, мы, как говориться, не ищем легких путей, да и покой нам только снится. К сожалению, FinalBuilder выдирать манифесты ещё не научился. А готовой консольной программы, которая могла бы запускаться из пакетных файлов, вырезать ресурсы и при этом корректно отдавать ExitCode, я за приемлемое время не нашел. Пришлось достать коленку, и на ней написать патчилку косяка. Вот, может быть кому-нибудь ещё пригодиться.

MD5 архива: 3abd737e5d990240b08d856f487a4b3b
MD5 ехе: 3b18c4323ec1226bbf466515c86ce1fa