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

前端之家收集整理的这篇文章主要介绍了如何确定一个单元是否被编译成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相关文章