Delphi 中的 Windows 7 登录屏幕保护程序

2024-01-11

我在使用 Delphi 应用程序作为 Windows 7 登录屏幕保护程序(适用于 32 位和 64 位 Windows)时遇到问题。即使是空白应用程序(没有任何额外代码的新项目)也会引发错误。

Delphi 7 应用程序抛出“无法读取内存”错误,Delphi 2010 应用程序抛出“应用程序中发生异常未知软件异常”,然后抛出“运行时错误 217”。此错误发生在任何表单初始化之前以及异常处理程序的任何初始化之前。

将 notepad.exe 设置为登录屏幕保护程序效果很好。

有什么想法吗?


正如我在评论中所说,这不是“隐形代码”,只是导致问题的某些单元的初始化部分中的代码。我已经成功地找到了罪魁祸首(至少是其中之一 - 可能还有其他人)。

当您使用Forms单位,它依赖于Classes unit.

初始化部分调用InitThreadSynchronization,其中包括以下内容:

SyncEvent := CreateEvent(nil, True, False, '');
if SyncEvent = 0 then
  RaiseLastOSError;

看来API调用CreateEvent从登录屏幕内调用时失败。不幸的是,我不确定登录屏幕是否:(a) 禁止CreateEvent总共 (b) 要求CreateEventEx相反或(c)将与适当的lpEventAttributes争论。我发布了一个更具体的问题,希望能找到答案:从 Windows-7 登录屏幕创建事件 https://stackoverflow.com/q/24726463/224704

您可以使用以下控制台应用程序验证问题:

program TestLoginScreensaver;

{$APPTYPE CONSOLE}

uses
  Windows,
  SysUtils;

var
  SyncEvent: THandle;

begin
  try
    SyncEvent := CreateEvent(nil, True, False, '');
    if SyncEvent = 0 then
      RaiseLastOSError;
    CloseHandle(SyncEvent); //So handle is closed if it was created (e.g. while logged in)
  except
    on E:Exception do
      Writeln(E.Classname, ': ', E.Message);
  end;
  Readln;
end.

的目的SyncEvent是为了启用TThread实例同步回主线程。因此,如果您编写一个单线程应用程序,或者使用除TThread,你实际上并不需要/使用SyncEvent at all.

旁白:这是使用问题的一个主要例子初始化部分。仅仅包含一个单元就有可能引入不必要的副作用。他们是基本上无害,但在本例中并非如此。现在你可能会争辩说Classes.pas很臃肿,我不会争论。但重点是,如果类初始化被调用明确地从 DPR 来看,这个问题会更容易识别并找到解决方法。


编辑:新解决方案

正如雷米·勒博(Remy Lebeau)在我发布的另一个问题中指出的那样。
该行:

    SyncEvent := CreateEvent(nil, True, False, '');

必须改为:

    SyncEvent := CreateEvent(nil, True, False, nil);

由于此解决方案涉及重新编译 VCL 单元,因此您可能需要经历一些之前的问题 https://stackoverflow.com/search?q=%5Bdelphi%5D+recompile+vcl+units关于这个话题

有了这个作为唯一的更改(在 D2009 中编译),我能够在登录屏幕上成功显示空白表单。但是,请记住,由于登录屏幕上的安全限制,您通常希望能够执行的某些操作将受到限制。

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

Delphi 中的 Windows 7 登录屏幕保护程序 的相关文章

  • Golang 网络爬虫 NTLM 身份验证

    Golang 网络抓取工具需要从经过 NTLM 验证的网页中提取信息 有了有效的用户名和密码 网络抓取工具如何与服务器进行 NTLM 4 次握手 以获得对后面受保护网页的访问权限 url username password http www
  • 在 Delphi XE 中将类作为过程的参数传递

    我需要做的是这样的 procedure A type of form var form TForm begin form type of form Create application form showmodal freeandnil f
  • 瓦廷 Windows 身份验证

    我正在尝试为使用集成身份验证的 Intranet 应用程序编写 Watin 测试 我尝试测试的网页打印 Page User Identity Name 这是我测试的一些代码 if Win32 LogonUser u UserName u D
  • Django 自定义 UserManager 中的 self.model()

    所以 我对 Django 还很陌生 尽管我的代码在遵循 Django 文档 在 Django 中自定义身份验证 之后工作 但我不明白他们的示例中的 self model 实际如何工作 它来自哪里以及它如何与 自己 这是在文档底部找到的示例
  • Delphi 的免费加密库 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在为 Delphi 2010 寻找一个免费且最新的加密库 该库实现 RSA 和 AES Rijnda
  • 在浏览器上验证 JWT

    我一直在读关于JWT https jwt io 我知道它分为三个部分 即header payload and signature 我将哈希算法保留在标头中 将基本信息保留在有效负载中例如 姓名 年龄 职务 有效期等在有效负载中 然后这两个都
  • 如何将 TGifImage 中的帧提取为位图?

    下面的演示尝试在表单的画布上绘制 GIF 这不起作用 图像不会前进 如何让它发挥作用 procedure TForm1 FormCreate Sender TObject begin GIF TGIFImage Create GIF Loa
  • Delphi XE2 Firemonkey 示例应用程序未在 MAC 上运行

    我正在尝试在 Mac 上运行示例 Firemonkey 应用程序 但我在 Mac 中收到以下消息 dyld Library not loaded rpath libcgunwind 1 0 dylib Referenced from Use
  • 使用单个查询和每用户密码盐进行用户登录

    我决定使用存储在数据库中的每用户盐来实现用户登录 盐作为密码的前缀 该密码使用 SHA 进行哈希处理并存储在数据库中 过去 当我不使用盐时 我会使用典型的方法 使用用户输入的用户名和密码来计算查询返回的行数 然而 对于每个用户的盐 您需要先
  • nginx代理认证拦截

    我有几个服务 它们支持 nginx 实例 为了处理身份验证 在 nginx 中 我拦截每个请求并将其发送到身份验证服务 在那里 如果凭据正确 我将设置一个包含用户相关信息的 cookie 现在 请求应该被路由到适当的服务 并设置 cooki
  • Delphi中的抽象类

    我正在使用一个具有许多抽象类的组件套件 现在我想应用多态性 但在创建对象时收到错误抽象类 即使我不需要 我是否应该重写所有虚拟方法 有什么解决方法或解决方案吗 为了创建类的实例 您需要重写所有声明为虚拟抽象的方法 即使您不使用它们 如果您确
  • 使用操作系统用户名/密码在 PHP 中进行身份验证?

    我想知道是否有一种方法可以使用 PHP 或者可能是其他一些 CGI 但最好是 PHP 来使用其操作系统 在本例中为 Linux Debian 5 用户名和密码来验证用户 可能的 难的 谢谢 一般来说 这种东西是特定于操作系统的 并与现有的身
  • 在 Delphi 2007 中将具有透明度的位图保存为 PNG

    我有一个包含透明度信息的 Delphi 位图 32 位 我需要将其转换并保存为 PNG 文件 同时保留透明度 我目前拥有的工具是graphics32 Library GR32 PNG 由Christian Budde 提供 和PNGImag
  • 如何在 Asp.Net MVC 上实现客户端 Ajax 登录(Asp.Net Webforms 解决方案的链接位于此处)

    我正在尝试在 Asp Net MVC 上实现客户端 ajax 登录 我以前在 WebForms 上设置得很好 但现在我已经转向 MVC 这给我带来了一些麻烦 如果您想要有关 Asp Net Webforms 的客户端 Ajax 登录的教程
  • IdentityServer4 客户端 - 刷新 CookieAuthenticationEvents 上的访问令牌

    我试图在访问令牌过期时使用刷新令牌 类似的问题已回答here https stackoverflow com a 41557598 3501052 And 更新令牌的示例代码 https stackoverflow com question
  • 从 Delphi 调用 C# dll

    我用单一方法编写了 Net 3 5 dll 由Delphi exe调用 不幸的是它不起作用 步骤 1 使用以下代码创建 C 3 5 dll public class MyDllClass public static int MyDllMet
  • 在Delphi 7中,为什么我可以给const赋值?

    我将一些 Delphi 代码从一个项目复制到另一个项目 发现它在新项目中无法编译 但在旧项目中可以编译 代码看起来像这样 procedure TForm1 CalculateGP const Price money 0 begin Pric
  • 从 Kubernetes Python 客户端登录到 GitLab 存储库

    我有一个 Django 应用程序 它使用python 的官方 Kubernetes 客户端 https github com kubernetes client python并且工作正常 但它只部署 正确 公共注册表 有没有办法执行登录后让
  • 调试器异常错误和内存超调

    我尝试运行以下代码 但它显示有关内存地址的错误 并显示一条消息 循环后 n 可能未定义 请看一看 var n max integer n integer r R1 f h0 Array of Real const h 0 00889 nip
  • Grails + Spring Security:无法登录

    我刚刚开始学习Grails和Spring 我已经按照官方教程创建了一个登录系统 但我无法登录 用户名或密码不匹配 我知道 90 的情况下这是由于双重编码或多个数据源 这也导致双重编码 造成的 但我也没有这样做 class BootStrap

随机推荐

  • 为什么我不能在具有类型参数的特征上添加一揽子实现?

    考虑这两个特征 pub trait Foo fn new arg u32 gt Self pub trait Bar p Foo fn with parameter arg u32 parameter P gt Self 我想添加毯子暗示
  • Push Segue 在 iOS 5 中不起作用

    我对 IOS 非常陌生 我正在使用情节提要功能来创建应用程序 这就是我想要的 我有两个视图控制器 一个 ViewController 和两个 ViewController 我在一个 ViewController 中有一个按钮 O 按住 ct
  • 迭代通过域模型上的 linq 查询返回的对象的属性和值

    我在关系数据库中有一个自定义实体 我已通过域模型将其映射到 CLR 因此 通过使用以下语句 我可以通过域模型上的 LINQ 查询将实体从数据库拉入内存 如下所示 var inspection from i in dbContext New
  • 在 swift 中将 JSON 对象解析为字符串数组

    我有以下 Json 响应 language en textAngle 0 orientation Up regions boundingBox 96 29 244 474 lines boundingBox 96 29 58 12 word
  • 使用字符串/分类特征(变量)进行线性回归分析?

    回归算法似乎正在研究以数字表示的特征 例如 该数据集不包含分类特征 变量 如何对这些数据进行回归并预测价格是非常清楚的 但现在我想对包含分类特征的数据进行回归分析 有5特征 District Condition Material Secur
  • -1 * int.MinValue == int.MinValue??这是一个错误吗?

    在 C 中我看到了 1 int MinValue int MinValue 这是一个错误吗 当我尝试实现搜索树时 它真的把我搞砸了 我最终使用了 int MinValue 1 这样我就可以正确地否定它 这不是一个错误 int MinValu
  • Java在C中的易失性?

    我知道使用volatile在爪哇 即 基于维基百科文章 http en wikipedia org wiki Volatile variable 对易失性对象的读取和写入存在全局顺序 多变的 这意味着每个访问易失性字段的线程 将在继续之前读
  • 如何使用 python/distutils 依赖系统命令?

    我正在寻找最优雅的方式来通知我的库的用户他们需要特定的 unix 命令来确保它能够工作 什么时候是我的库提出错误的最佳时间 安装 当我的应用程序调用命令时 在导入我的库时 both 还有你应该如何检测命令是否丢失 if not comman
  • 查看模板代码标签 - asp.net mvc - regd

    在 asp net MVC 视图引擎上下文中 和 之间有什么区别 在MVC2书中给出如下 代码块在视图模板呈现时执行代码 代码块执行其中包含的代码 然后将结果呈现到模板的输出流 什么时候使用第一个 什么时候使用第二个 这本书几乎是正确的 代
  • findViewById(R.id.content) 和 getRootView() 之间的区别[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions findViewById R id
  • log4j2配置中RollingFile和RollingRandomAccessFile有什么区别

    在我们当前的实现中 其中一台服务器具有为 RollingRandomAccessFile 和另一个 RollingFile 设置的 log4j2 配置 如果可能的话 我想知道两者之间的区别以及各自的优缺点 Thanks 主要区别在于性能 h
  • 如何将拉取请求合并到我的 github 项目的功能分支中?

    有人通过 fork 向我的 GitHub 项目提交了拉取请求 我不想直接合并到 master 中 而是更愿意将更改合并到功能分支中 以便我可以在将最终产品合并到 master 之前进行一些小的编辑 如果可能的话 我希望 GitHub 向提交
  • 'c:/wamp64/bin/php/php7.0.10/ext/php_oci8_12c.dll' - %1 不是有效的 win32 应用程序

    为了从 php 访问远程 Oracle 数据库 我必须激活扩展php oci8 12c 但是当我这样做时 它不会出现在phpinfo 另一方面 我在 php 日志中收到错误消息 13 Jan 2017 08 39 48 UTC PHP 警告
  • 更改 MS Access 元素的默认样式

    当我向表单添加任何元素 如文本框 标签等控件 时 它的默认样式为 字体 Calibri 详细 字体大小 11 前景色 文本 2 浅 40 怎么可能改变这一点 我需要 MS Sans Serif 8 黑色作为默认值 Thanks 在 Acce
  • 如何读取javascript变量中的文件内容?

    我有一个小脚本 用于在每 4 个字符之后分割 var foo 内的文本 它运行良好 但我的实际数据位于文本文件 a txt 中 如何将整个文件文本放入 var foo 中 并将分割输出写入另一个文本文件 var foo this is sa
  • 按下背面退出 Android 应用程序

    我正在构建一个 Android 应用程序 如何在按下返回键时退出 Android 应用程序 Android版本为2 3 3及以上 Android 应用程序会转到我不想要的先前活动 Try this public void onBackPre
  • 错误:“MSVCP90.dll:没有此类文件或目录”,即使安装了 Microsoft Visual C++ 2008 Redistributable Package

    我正在尝试通过执行从源代码构建一个包python setup py py2exe 这是 setup py 中的代码部分 我认为相关 if sys platform win32 For py2exe import matplotlib sys
  • 降低非焦点项目的不透明度

    我有一个显示在主屏幕上的项目列表 该列表可以垂直滚动 目前我有 5 个项目 但当用户接近最后一个项目时会添加项目 从而创建无限滚动 我想让所有项目淡出 但焦点所在的项目应该完全透明 如下所示 正如您所看到的 左侧和右侧的项目已褪色并且稍小
  • Neo4j:使用 Cypher 批量关联节点的最佳方法?

    当我运行一个尝试批量合并特定类型的所有节点的脚本时 我得到了一些奇怪的性能结果 当合并 2 个节点集合 42k 和 26k 时 性能良好且快速 但是当我合并 42 和 5 时 性能急剧下降 我正在对 ParentNode 进行批处理 因此
  • Delphi 中的 Windows 7 登录屏幕保护程序

    我在使用 Delphi 应用程序作为 Windows 7 登录屏幕保护程序 适用于 32 位和 64 位 Windows 时遇到问题 即使是空白应用程序 没有任何额外代码的新项目 也会引发错误 Delphi 7 应用程序抛出 无法读取内存