我在项目中有两个单元(SuperPuper.pas和SuperPuper777.pas)(。exe或.dll)
是否可以在运行时从SuperPuper777.pas
中的代码中找出
SuperPuper.pas
列在项目的uses
子句中;
SuperPuper.pas
是项目uses
子句中的第一个单元。
这个问题经过大量编辑。我想,实际目的是找出ShareMem.pas
单位是否在项目的uses
子句中声明正确位置。
答案 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文件执行基于正则表达式的简单检查,如果不符合预期则返回错误。不是万无一失,但可能只是为了少量努力而实现最佳效用。
我意识到你的问题要求运行时检测,但这是一个编译时属性,所以最好在编译时受到攻击。