2

我有一个 Delphi 6 应用程序,它出现EOSError 异常,代码 5,访问被拒绝,但只有当我切换到另一个 Windows 7 用户帐户,或者我锁定站时。我正在打印一个堆栈跟踪,但错误似乎直接来自 Application.Run() 语句,Application.ProcessMessages() 紧挨在堆栈上。堆栈的其余部分是我的异常处理代码。

在操作期间,代码确实会调用 ShellExecuteEx() 并访问 COM/ActiveX 对象,但仅当用户明确单击按钮时。这只发生在 Windows 7 上,不会发生在 Windows XP 上。我更改了我的应用程序,使其完全安装到用户应用程序数据目录,因此不需要访问任何管理员权限目录。我知道这不重要,但我指出以防万一。

当这种情况发生时,异常来得又快又猛。我捕获它们并将它们转储到错误日志中,以避免用大量对话框困扰用户。谁能告诉我仅仅通过切换或锁定当前登录的用户会引发这些错误的泛滥吗?当当前用户帐户未激活时,为什么我的应用程序会遇到问题?

一念。如果用户当前没有登录,一些位图操作会导致麻烦吗?我确实有一个旋转标签云,它不断执行 Windows API 位图操作以更新标签云图像。这可能与它有关吗?

如果是这样,我可以尝试在当前用户被关闭或锁定时停用标签云,但我相信我需要 Delphi 的代码来响应此 Stack Overflow 帖子中提到的事件:

如何从 WPF 应用程序中检测到 Lock This Computer 命令?

更新:我做了一些额外的测试。在我访问 Evernote 的 COM/ActiveX 接口(我正在与之交互的软件)之前,这些错误不会发生。一旦我通过 COM API 首次调用 Evernote,当我锁定工作站时,错误立即发生。

4

2 回答 2

2

我发现了问题。这是因为我在计时器上调用Controls.TMouse.GetCursorPos()来更新我在原始帖子中提到的标签云视图。如果当前桌面不可用,该功能将引发异常,例如当您切换到另一个用户帐户或锁定工作站时。这篇 Stack Overflow 帖子涵盖了 GetCursorPos() 函数的一般 WinAPI 上下文中的问题。

调用 TMouse.GetCursorPos 有时会失败,并显示“调用 OS 函数失败”

与上述帖子的作者相反,它只发生在 Windows 7 上,而不发生在 Windows XP 上。我需要更改我的代码以检测活动桌面何时不再可用,并使用TLama 向我建议的下面链接的帖子中介绍的会话锁定/解锁/登录/注销检测技术抑制该调用。见大卫赫弗南的回答:

应用程序必须做什么才能“支持”远程桌面服务?

于 2012-10-09T01:09:51.093 回答
1

如果可能的话,您的用户可以将您的程序更改为兼容模式 XP SP3,这可能会消除这些错误。这显然是一种解决方法。

您可以使用processmonitorwithfilemon来查看 Windows 上发生了什么: http ://technet.microsoft.com/en-us/sysinternals/bb896645.aspx

完整套件: http ://technet.microsoft.com/en-us/sysinternals/bb842062

于 2012-10-08T10:37:33.833 回答