微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何确定一个单元是否被编译成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中的实现,并编写自己的版本,当找到该单元时停止枚举.)

原文地址:https://www.jb51.cc/delphi/102757.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐