Windows 7登录屏幕保护程序在Delphi

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

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

将notepad.exe设置为登录屏幕保护程序工作正常.

有什么想法吗?

正如我在评论中所说的那样,它不是“隐形代码”,只是一些单元的初始化部分中的代码导致了问题.我已经设法追查罪魁祸首(至少有一个 – 可能还有其他人).

当您使用窗体单元时,它会依赖于类单元.

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

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

在登录屏幕中调用API API调用CreateEvent失败.不幸的是,我不确定登录屏幕是否:(a)禁止CreateEvent完全(b)需要CreateEventEx,或(c)将使用适当的lpEventAttributes参数.我已经发布了一个更具体的问题,希望能够找出:CreateEvent from Windows-7 Logon Screen

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

program TestLoginScreensaver;

{$APPTYPE CONSOLE}

uses
  Windows,SysUtils;

var
  SyncEvent: THandle;

begin
  try
    SyncEvent := CreateEvent(nil,'');
    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.

SIDE-RANT: This is a prime example of the problem with using the initialization section. Merely including a unit has the potential to introduce unnecessary side-effects. They’re Mostly Harmless,but not in this case. Now you may argue that Classes.pas is bloated,and I won’t argue. But the point is that if Classes initialization were called explicitly from the DPR,this problem would have been easier to identify and find a workaround for.

编辑:新解决方案

正如雷米·雷博在另一个问题中指出的那样.
行:

SyncEvent := CreateEvent(nil,'');

必须更改为:

SyncEvent := CreateEvent(nil,nil);

由于这个解决方案涉及重新编译VCL单元,所以您可能想要了解这个问题上的几个previous questions

作为唯一的变化(在D2009中编译),我能够在登录屏幕上成功显示一个空白表单.但是,请记住,由于登录屏幕上的安全限制,您通常希望能够执行的某些操作将被禁用.

相关文章

文章浏览阅读2.2k次,点赞6次,收藏20次。在我们平时办公工作...
文章浏览阅读1k次。解决 Windows make command not found 和...
文章浏览阅读3.2k次,点赞2次,收藏6次。2、鼠标依次点击“计...
文章浏览阅读1.3w次。蓝光版属于高清版的一种。BD英文全名是...
文章浏览阅读974次,点赞7次,收藏8次。提供了更强大的功能,...
文章浏览阅读1.4w次,点赞5次,收藏22次。如果使用iterator的...