gpt4 book ai didi

delphi - "Use Debug DCU' s 的编译器选项?

转载 作者:行者123 更新时间:2023-12-03 15:23:35 25 4
gpt4 key购买 nike

在我正在编写的组件中,我想包含 automatic detection of registered image formats ,但该解决方案仅在禁用“使用调试 DCU 的”编译器选项时才有效。

真正想知道的是该解决方案的替代方案,不涉及编译器选项依赖性。

但目前,我只想知道如何在运行时检查使用调试 DCU 的编译器选项是否已设置。

最佳答案

没有可靠的方法在运行时获取该信息

使用调试 DCU 编译器选项仅切换搜索路径;编译器最终会发现什么是未知的。 (被误导的)用户可能已将 Release dcu 复制到调试目录中,反之亦然。

即使没有误导用户,人们也可能会将一些文件添加到项目中(并与项目一起编译),以便包含一些错误修复。例如,如果用户将Graphics.pas添加到项目中,执行发布/无调试构建,但保留使用调试DCU的编译器选项,则实际链接的 Graphics.dcu 不是调试版本,因为它是使用可执行文件重新构建的。所以你会得到一个调试和非调试 dcus 的“混合”包。

您可以尝试检测与某些对象或方法相关的调试信息是否存在,但这也是不可靠的:如果您使用“使用调试 Dcus 构建”,然后将“调试信息”设置为 false,那么您本质上是丢弃调试信息,这样您就无法再查找它。

但是该链接代码在调试 DCU 上失败

GLScene 项目中的代码不是一个好的 hack,它在 TPicture.RegisterFileFormat 的代码中使用硬编码偏移,然后继续使用硬编码偏移来获取全局 FileFormats 变量(不调用 GetFileFormats 例程)。里面有太多神奇的数字!

我的第一个想法是将使用 GLScene 方法识别的 TList 与我识别的 TList 进行比较,但猜猜看:< em>在我的机器上没有问题,在两种情况下,两个例程都得到了相同的结果。在我的机器上,GLScene 尽管很丑,但并没有被调试 DCU 破坏。

我什至尝试过“指纹识别”一些 rtl/vcl 单元(SysUtils、Graphics、Classes);我列出了所有公共(public)类,生成了一些代码,这些代码对每个类中的每个方法使用 RTTI,并将代码的前 1024 个字节转储到字符串文件中。使用调试 DCU 和非调试 DCU 运行该程序,我得到了相同的结果。我的文本文件包含大约 3500 种方法的指纹!

不是一个好主意

由于该选项并不真正影响编译器的编译方式(仅影响链接器链接的内容),因此创建依赖于该选项的代码非常不可靠,也不是一个好主意。 这只会影响低级黑客,并且您不希望低级黑客在您绝对无法控制的情况下导致应用程序崩溃。

唯一正确的选择是用不会失败(或至少以可控方式失败)的黑客替换可能失败的黑客。

关于delphi - "Use Debug DCU' s 的编译器选项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14674919/

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