如何确定一个单元是否被编译成Delphi程序?

我想要能够确定一个特定单元是否被编译成Delphi程序,例如单位SomeUnitName是我的一些程序的一部分,但不是其他程序的一部分.我想要一个功能
function IsSomeUnitNameInProgram: boolean;

(这当然不是在SomeUnitName中声明,因为在这种情况下它总是被包含),在运行时返回true,如果单元已被编译到程序中,则为false,否则为false.

到目前为止,我的想法已经沿用了使用jcl调试信息(从详细的地图文件中编译),我基本上添加到我所有的程序来确定这个信息,但是我希望它不需要jcl.

向SomeUnitName添加代码不是一个选项.

这是目前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中的实现,并编写自己的版本,当找到该单元时停止枚举.)

相关文章

 从网上看到《Delphi API HOOK完全说明》这篇文章,基本上都...
  从网上看到《Delphi API HOOK完全说明》这篇文章,基本上...
ffmpeg 是一套强大的开源的多媒体库 一般都是用 c/c+&#x...
32位CPU所含有的寄存器有:4个数据寄存器(EAX、EBX、ECX和ED...
1 mov dst, src dst是目的操作数,src是源操作数,指令实现的...