我有一个 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,当我锁定工作站时,错误立即发生。