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.
编辑:新解决方案 正如雷米·雷博在另一个问题中指出的那样. SyncEvent := CreateEvent(nil,''); 必须更改为: SyncEvent := CreateEvent(nil,nil); 由于这个解决方案涉及重新编译VCL单元,所以您可能想要了解这个问题上的几个previous questions 作为唯一的变化(在D2009中编译),我能够在登录屏幕上成功显示一个空白表单.但是,请记住,由于登录屏幕上的安全限制,您通常希望能够执行的某些操作将被禁用. (编辑:武陵站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 比Spark快100倍的GPU加速SQL引擎!BlazingSQL开源了
- Linux系统克隆工具之Top 6推荐
- .net – 什么原因导致Windows防火墙阻止应用程序?
- active-directory – 如果Windows商店将“所有内容”移动到
- windows – 如何自动更改Ephemeral驱动器的指定字母?
- 详解Linux Shell脚本编写技巧,附实例说明
- windows-server-2008 – 我在Windows Server 2008中可以拥有
- 使用WinXP系统自身功能隐藏文件的二种办法
- 使用GNOME优化工具自定义Linux桌面的10种方法
- win10电脑蓝牙驱动程序错误怎么解决

