gpt4 book ai didi

delphi - 如何判断一个单元是否已经编译成Delphi程序?

转载 作者:行者123 更新时间:2023-12-03 14:36:57 25 4
gpt4 key购买 nike

我希望能够确定特定单元是否已编译成 Delphi 程序,例如SomeUnitName 单元是我的某些程序的一部分,但不是其他程序的一部分。我想要一个函数

function IsSomeUnitNameInProgram: boolean;

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

到目前为止,我的想法一直是使用 jcl 调试信息(从详细的映射文件编译),我基本上将其添加到所有程序中以确定此信息,但如果不需要 jcl,我更喜欢它.

不能向 SomeUnitName 添加代码。

当前适用于 Delphi 2007,但最好也适用于 Delphi XE2。

有什么想法吗?

自 @DavidHeffernan 询问以来,有关此问题的一些背景:

这不仅适用于一个程序,而且适用于 100 多个不同的程序。其中大多数在内部使用,但也有一些交付给客户。由于我们使用了相当多的库,有些库在各种开源许可证下购买了其他库,因此我希望能够在“关于”框中添加一个“credits”选项卡,该选项卡仅显示那些实际编译到程序中的库,而不是所有库。感谢 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 - 如何判断一个单元是否已经编译成Delphi程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12104914/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com