Можно ли узнать положение единицы в предложении проекта? - PullRequest
0 голосов
/ 01 января 2012

У меня есть два модуля (SuperPuper.pas и SuperPuper777.pas) в проекте (.exe или .dll)

Можно ли во время выполнения узнать из моего кода в SuperPuper777.pas, что

  1. SuperPuper.pas указан в предложении uses проекта;

  2. SuperPuper.pas - первый блок в предложении uses проекта.


Вопрос был сильно отредактирован.Я полагаю, что практическая цель - выяснить, была ли объявлена ​​единица ShareMem.pas в правильном положении в предложении uses проекта.

Ответы [ 2 ]

1 голос
/ 01 января 2012

Если вы хотите применить правильное объявление модуля в предложении uses проекта, я бы добавил событие предварительной сборки для запуска сценария Perl / Python / Ruby на основе регулярных выражений. Сценарий выполняет простую проверку на основе регулярных выражений файла .dpr и возвращает ошибку, если она не соответствует назначению. Не надежный, но, вероятно, лучший баланс полезности для небольшого количества усилий.

Я понимаю, что ваш вопрос требует обнаружения во время выполнения, но это свойство времени компиляции и поэтому лучше всего подвергается атаке во время компиляции.

1 голос
/ 01 января 2012

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

О том, как определить, что модуль находится первым в предложении .dpr using, я не вижу никакого способа сделать это легко во время выполнения,Список в PACKAGEINFO находится не в этом порядке.Это можно сделать во время компиляции, проанализировав содержимое .dpr и проверив его условие использования.

Единственный способ угадать, какая единица измерения была задана первой, - это использовать глобальную переменную в общей единице:

 var LatestUnitSet: (oneUnit, anotherUnit);

Затем в разделе инициализации каждого устройства:

initialization
  LatestUnitSet := OneUnit;
...


initialization
  LatestUnitSet := anotherUnit;
...

Затем проверьте на LatestUnitSet, чтобы увидеть, какой из них был инициализирован последним.

...