【问题标题】:is there a way to obtain the same result than set compiler flags at runtime for PEFlags?有没有办法获得与在运行时为 PEFlags 设置编译器标志相同的结果?
【发布时间】:2018-10-03 07:27:14
【问题描述】:

几年前,我在某些特定 LAN 上的共享文件夹中运行大型 (100+MB) exe 时偶然发现了 C0000006 external exception。所以我开始使用this question 中描述的编译器标志。

在数百个网络中的数百个客户上成功“执行 exe”多年后,我开始遇到 PE 标志问题(不知何故,exe 在同一台电脑上启动时崩溃,并且一次排除一个原因,我凭经验发现评论这些标志是有效的)。

不知何故,我发现的解决方法是构建我的 exe 两次(并让客户选择部署哪个),第一次使用这些:

{$SetPEFlags IMAGE_FILE_NET_RUN_FROM_SWAP}
{$SetPEFlags IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP} 

第二个评论这些。

这种建筑开销很烦人,我想避免它。我不认为有办法,但我请教专家建议:有没有办法“在运行时激活这些标志?”例如传递命令行参数?

我想到的另一种解决方法是在 exe 启动时将 exe 复制到本地,以便始终从本地计算机执行它,但我担心我需要面对的场景,即使从技术上来说它很简单。

谢谢。

【问题讨论】:

    标签: delphi delphi-10-seattle compiler-flags


    【解决方案1】:

    有没有办法在运行时激活这些标志,例如通过传递命令行参数?

    不,没有。这些 PE 标志由系统加载程序处理,并且在执行可执行文件中的任何代码之前确定结果。

    我想到的另一种解决方法是在 exe 启动时将 exe 复制到本地,以便始终从本地计算机执行。

    这正是这些 PE 标志所具有的效果。如果可执行文件驻留在网络卷或可移动卷上,则首先将其复制到交换文件(本地文件),然后执行。

    【讨论】:

    • 谢谢。您如何看待我的解决方法?我喜欢在本地复制 exe 的想法,但我担心在某些超级安全的 LAN 上这个过程会被自动阻止。
    • 我认为您没有正确诊断出故障,或者至少没有清楚地描述它。您说通过两次构建可执行文件来解决问题。那么,两次建造它如何改变结果呢?这没什么意义。或者你提供两个版本?不管怎样,我回答了你提出的问题。
    • 是的,你是对的,我的意思是构建它两次,让有问题的客户下载第二个。这是可以接受的,因为到目前为止,只有不到 2% 的客户有这个问题,所以我可以处理。我修改了我的问题以更好地说明这一点。
    • 从网络卷运行可执行文件充其量是不稳定的。告诉你的客户不要这样做,你的问题就会消失。我就是这么做的。
    • 这取决于你如何解决这个问题,毕竟这是你的问题。无论如何,我回答了我认为你回答的两个直接问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多