我想要能够确定一个特定单元是否被编译成Delphi程序,例如单位SomeUnitName是我的一些程序的一部分,但不是其他程序的一部分.我想要一个功能
function IsSomeUnitNameInProgram: boolean;
(这当然不是在SomeUnitName中声明,因为在这种情况下它总是被包含),在运行时返回true,如果单元已被编译到程序中,则为false,否则为false.
到目前为止,我的想法已经沿用了使用jcl调试信息(从详细的地图文件中编译),我基本上添加到我所有的程序来确定这个信息,但是我希望它不需要jcl.
这是目前Delphi 2007,但最好也应该适用于Delphi XE2.
有什么想法吗?
一些背景,自@DavidHeffernan问:
这不仅仅是一个程序,而是100多个程序.他们大多数是在内部使用,但有些也交付给客户.由于我们使用了相当多的图书馆,有些人以各种开源许可证的方式购买了其他的图书,我希望能够在相关框中添加一个“学分”选项卡,该框只显示实际编译到程序中而不是所有程序库的库.感谢TOndrej的答案,这个工作目前正好像我想要的那样:
代码检查如果程序使用库时始终链接的单元,如果它在那里,则将库名称,版权和链接添加到关于框中.
解决方法
单位名称编译成“PACKAGEINFO”资源,您可以在其中查找:
uses SysUtils; type PUnitInfo = ^TUnitInfo; TUnitInfo = record UnitName: string; Found: PBoolean; end; procedure HasUnitProc(const Name: string; NameType: TNameType; Flags: Byte; Param: Pointer); begin case NameType of ntContainsUnit: with PUnitInfo(Param)^ do if SameText(Name,UnitName) then Found^ := True; end; end; function IsUnitCompiledIn(Module: HMODULE; const UnitName: string): Boolean; var Info: TUnitInfo; Flags: Integer; begin Result := False; Info.UnitName := UnitName; Info.Found := @Result; GetPackageInfo(Module,@Info,Flags,HasUnitProc); end;
要做到这一点当前的可执行文件通过它HInstance:
HasActiveX := IsUnitCompiledIn(HInstance,'ActiveX');
(GetPackageInfo
列举了所有可能对具有许多单元的可执行文件效率低下的单元,在这种情况下,您可以剖析SysUtils中的实现,并编写自己的版本,当找到该单元时停止枚举.)