是否有可能在项目的使用条款中找出单位的位置?

时间:2012-01-01 07:03:17

标签: delphi delphi-xe2

我在项目中有两个单元(SuperPuper.pas和SuperPuper777.pas)(。exe或.dll)

是否可以在运行时从SuperPuper777.pas中的代码中找出

  1. SuperPuper.pas列在项目的uses子句中;

  2. SuperPuper.pas是项目uses子句中的第一个单元。


  3. 这个问题经过大量编辑。我想,实际目的是找出ShareMem.pas单位是否在项目的uses子句中声明正确位置。

2 个答案:

答案 0 :(得分:1)

您可以从资源中获取链接到可执行文件的所有单元的列表(即在运行时)。有一个名为PACKAGEINFO的资源,其中包含所有单位的列表。您可以找到一些反向信息from here。也许您可以从增强型RTTI获得此信息(自Delphi 2010起可用)。

关于如何检测单元在.dpr uses子句中的第一个,我没有看到任何方法在运行时轻松完成。 PACKAGEINFO中的列表不按此顺序排列。您可以在编译时通过解析.dpr内容并检查其uses子句来完成此操作。

我看到猜测首先设置哪个单位的唯一方法是在公共单元中使用全局变量:

 var LatestUnitSet: (oneUnit, anotherUnit);

然后在每个单元的初始化部分:

initialization
  LatestUnitSet := OneUnit;
...


initialization
  LatestUnitSet := anotherUnit;
...

然后检查LatestUnitSet以查看哪个是最新的。

答案 1 :(得分:1)

如果要在项目的uses子句中强制执行单元的正确声明,我会添加一个预构建事件来运行基于正则表达式的Perl / Python / Ruby脚本。该脚本将对.dpr文件执行基于正则表达式的简单检查,如果不符合预期则返回错误。不是万无一失,但可能只是为了少量努力而实现最佳效用。

我意识到你的问题要求运行时检测,但这是一个编译时属性,所以最好在编译时受到攻击。