桌面 Delphi 应用程序是否可以通过 Windows 8 认证(使用 Windows 应用程序认证套件)?

2024-05-03

显然,Delphi(任何版本)不支持安全异常处理程序 https://forums.embarcadero.com/thread.jspa?messageID=473469(Visual Studio 中的 /SAFESEH 开关)。在 Windows 8 上使用 Windows 桌面应用程序认证套件时,这会导致出现警告。认证要求 http://msdn.microsoft.com/en-us/library/windows/desktop/hh749939对于 Windows 8 桌面应用程序:

您的应用程序必须使用 /SafeSEH 标志进行编译,以确保安全的异常处理

显然Delphi缺少这个开关,所以无法做到。我的问题是:

  1. 我的理解是否正确,即使该套件仅显示警告(而不是失败),但由于这是“必须”要求,目前任何 Delphi 应用程序都无法获得 Windows 8 认证,因此无法包含在 Windows 应用程序商店中?

  2. SafeSEH 表是否可以在编译后以某种方式添加到 PE 文件中(例如从映射文件或调试符号中提取所需信息),或者我们绝对需要编译器/链接器支持,因此必须等到 Embarcadero 实现此功能?

澄清一下,我的应用程序是 Windows 32 位桌面应用程序(64 位兼容),不是地铁应用程序.


我无法回答问题1。但是,我很难想象这个词的使用must可能意味着该规则是可选的。

至于问题2,您需要编译器/链接器的支持。您不能合理地期望使用 PE 编辑后链接工具来恢复它。考虑以下代码:

try
  Beep;
except
  on E: Exception do
    Writeln(E.ClassName, ': ', E.Message);
end;

编译器发出以下内容:

Project1.dpr.11: try
0041C3AA 33C0             xor eax,eax
0041C3AC 55               push ebp
0041C3AD 68C9C34100       push $0041c3c9 // exception handler is at $0041c3c9
0041C3B2 64FF30           push dword ptr fs:[eax]
0041C3B5 648920           mov fs:[eax],esp
Project1.dpr.12: Beep;
0041C3B8 6A00             push $00
0041C3BA E8E1CEFEFF       call MessageBeep
0041C3BF 33C0             xor eax,eax
0041C3C1 5A               pop edx
0041C3C2 59               pop ecx
0041C3C3 59               pop ecx
0041C3C4 648910           mov fs:[eax],edx
0041C3C7 EB59             jmp $0041c422
0041C3C9 E97291FEFF       jmp @HandleOnException
0041C3CE 0100             add [eax],eax
0041C3D0 0000             add [eax],al
0041C3D2 E42F             in al,$2f
0041C3D4 41               inc ecx
0041C3D5 00DA             add dl,bl
0041C3D7 C3               ret 
0041C3D8 41               inc ecx
0041C3D9 00A3D83E4200     add [ebx+$00423ed8],ah
Project1.dpr.15: Writeln(E.ClassName, ': ', E.Message);
........

现在,真正的异常处理程序是HandleOnException,实施于System.pas。但是,压入堆栈的地址是$0041c3c9,包含以下代码的本地地址try/except堵塞。这意味着为了创建 SafeSEH PE 部分,您需要找到每个try/except在你的代码中。虽然这显然是可行的,但我认为这并不容易处理。

我宁愿想象 x86 编译器的 SEH 异常处理程序只是_HandleXXX中声明的函数System.pas。在这种情况下,添加仅列出这些函数的 PE 部分作为链接后步骤就很容易了。然而,由于每一个try/except有自己的本地异常处理程序,我现在相信只有编译器作者才能真正希望添加 SafeSEH PE 部分。

据我所知,没有任何质量控制报告要求SafeSEH支持 x86 Windows 编译器。我建议您记录质量控制报告和官方支持案例。

Update:@haimg 做得很好,在我失败的地方取得了成功,并设法找到了 QC 报告:QC#106781 http://qc.embarcadero.com/wc/qcmain.aspx?d=106781.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

桌面 Delphi 应用程序是否可以通过 Windows 8 认证(使用 Windows 应用程序认证套件)? 的相关文章

  • 如何更新Delphi对象检查器?

    继我最近发布的这个问题之后 组件编辑器可以在多个组件上执行吗 https stackoverflow com questions 14802371 can a component editor be executed on multiple
  • 如何添加资源并使用它们

    在我的应用程序中 我想添加 2 个图像作为资源 我想使用这些图像 当我在应用程序中单击 是 按钮时 第一张图像将被设置为壁纸 当我在应用程序中单击 否 按钮时 第二张图像将被设置为桌面壁纸 提前致谢 regards 最简单的方法是创建一个文
  • 无法使用“无”覆盖背景颜色,只能使用“继承”

    我试图从 Windows 8 ListView 控件中的 win container 元素 图块 中删除白色背景 以使背景显示出来 当我追踪样式时 我可以看到白色背景是按照以下规则应用的 win listview not win footp
  • 如何以编程方式安排任务

    如何使用 delphi 7 像 Google updater 一样安排任务 我没有使用注册表 因为它被卡巴斯基防病毒软件检测为误报 我在注册表中作为启动项添加的任何内容都会被检测为特洛伊木马 因此我决定使用任务计划 下面的代码展示了如何删除
  • 如何在 OSX 上的应用程序名称下创建子项菜单?

    如何在下面添加TMenuItemProject1以上Quit在下面的屏幕截图上 我创建了一个 TMenuBar 并选中了 UseOSMenu 属性 我添加的第一个 TMenuItem 是主栏中的第二个 TMenuItem 您可以通过将 II
  • 如何像在iOS中一样在WP8中使用Prefix.pch?

    在 iOS 中 我有 5 个使用相同代码的应用程序 我能够引用公共类并使用 Prefix pch 文件中的值来分隔应用程序名称 主题和颜色 我的前缀文件有这些 define APPLICATION NAME Application01 de
  • 如何在 Windows 8 Metro 应用程序中制作导航动画?

    在使用 HTML 的 Metro 应用程序中 建议使用片段导航到不同的页面 在这里解释 http msdn microsoft com en us library windows apps hh452768 aspx navigation
  • 我可以让我的 Delphi 应用程序在特定时间(例如上午 12:00)启动,而不运行应用程序吗?

    我看到一个已安装的应用程序 它从供应商的网站提供一些 XML 数据并将其显示在主窗体窗口中 我想这很简单 但我注意到 即使我关闭系统托盘中的应用程序 明天早上 上午 12 00 正好 它也会再次弹出 这太酷了 我不确定它是用 Delphi
  • 运行delphi客户端自动化程序后excel.exe保持加载状态的原因是什么?

    我编写了一个 Delphi 程序 该程序从单个 XLS 文件的多个不同电子表格中提取数据并将其合并到文本文件中以供以后处理 这是德尔福7console程序 最相关的代码片段的摘录将向您表明 显然 我的程序表现得相当好 或者至少达到了它需要的
  • 当显示对话框时淡出应用程序的所有其他窗口?

    如何在 Delphi 2009 中调暗 淡出应用程序的所有其他窗口 Form 有一个 AlphaBlend 属性 但它仅控制透明度级别 但如果我们能有这样的东西那就太好了 集中窗口 http www anappaday com downlo
  • Async InputQuery 不处理“取消”按钮

    我正在使用一个简单的调用TDialogServiceAsync InputQuery 使用单个输入 它只是忽略了Cancel按钮和窗口的X关闭按钮 But the Ok按钮工作正常 这是我的代码 uses FMX DialogService
  • 如何将 REST API 与 FireMonkey 结合使用?

    我需要在 FireMonkey 中实现 REST API 来获取一些信息 但我不确定如何做到这一点 REST API使用OAuth2 我可以访问两个代码 Consumer Key和Consumer Secret 之后 我需要获得一个临时的
  • 如何仅使用 TADOQuery 组件将图像插入数据库

    我有一个简单的基本问题 我正在尝试使用将图像插入数据库Insert与其他列值的语句也使用TADOQuery成分 由于代码已经由某人编写 因此我想在此处放置一些虚拟示例代码 以供您澄清相应的步骤 请注意 这可以正常工作TQuery组件 因为我
  • 我如何在Delphi中处理事件?

    例如 我有一个程序 在单击 Button1 后执行某些操作 如果没有 Button1Click 中的代码 如何处理按钮的 onclick 事件 我需要为 Button1 动态添加事件 unit Unit1 interface uses Wi
  • 无法在 Windows 8 上的 IIS 中提供 WCF 服务

    当我尝试在 Windows 8 计算机中的 IIS 上提供 WCF 服务时 出现众所周知的错误 由于扩展配置的原因 无法提供您请求的页面 如果页面是脚本 请添加处理程序 如果应下载该文件 请添加 MIME 映射 旧的解决方法是运行aspne
  • 有人用CrossKylix进行真正的跨平台开发吗?

    新版本克罗斯凯利克斯 http crosskylix untergrund net 两周前更新过 即使 Kylix 已经停产很久了 但它似乎仍然被一些 Delphi 开发人员使用 有人在 Windows 和 Linux 的跨平台开发中成功使
  • Word 2010 自动化:“转到书签”

    我有一个用 Delphi 7 编写的程序 它打开一个基于模板的新 Word 文档 文档打开后 系统会自动跳转到书签 在模板中预定义 并在其中添加一些文本 以下代码在 Word 2003 中工作正常 但会导致invalid variant o
  • delphi中如何实现多重继承?

    我正在对一个旧库进行完全重写 我不确定如何处理这种情况 为了便于理解 大家都欢呼自行车类比 我有以下课程 TBike 自行车本身 TBikeWheel 自行车的一个轮子 TBikeWheelFront and TBikeWheelBack
  • 如何订阅 C++/CX 中 Windows 运行时组件内引发的事件?

    我在 Windows 运行时组件 用 C 编写 中有一个引发事件的类 我无法弄清楚如何在引用该组件的 C CX 应用程序中订阅这些事件 C 代码 在 Windows 运行时组件中 public sealed class Messenger
  • 如何更改 TPageControl 上标签的方向?

    我是 Delphi 的新手 再次强调 我在 1994 年就使用过 Delphi 我现在有 Delphi 2009 Pro 来自Java 我发现对象继承非常晦涩 我的用户想要选项卡位于左侧的选项卡式页面 但是 TPageControl 不允许

随机推荐