【发布时间】:2010-11-02 07:04:32
【问题描述】:
有时我的应用程序会出现以下错误。
这通常发生在用户离开办公桌而我的程序打开时。当他们回来时,这个错误就出现了。
TMouse.GetCursorPostion 除了对 GetCursorPosition 进行 Windows API 调用外,不做任何事情。然后它检查返回值,如果失败则调用 GetLastError。
“对 OS 函数的调用失败”对于追查其原因并不是很有帮助。屏幕保护程序或睡眠模式是否会导致此错误?我可以修改组件以捕获并忽略错误,但如果可能的话,我宁愿首先知道它发生的原因/原因。
我的应用程序使用的是 Delphi 2007,并且调用是由 Quasidata 从 Transfer@Once (v 1.7) 组件发出的。
这里是调用栈:
操作系统:Windows XP Service Pack 3 build 2600 异常编号:1 异常类:EOSError 异常消息:对 OS 函数的调用失败。 主线程($d34): 0045e208 UaarSales.exe SysUtils RaiseLastOSError 0045e191 UaarSales.exe SysUtils RaiseLastOSError 0045e237 UaarSales.exe SysUtils Win32Check 004c6de9 UaarSales.exe 控制 TMouse.GetCursorPos 00736d8b UaarSales.exe taoCntrr 3999 TtaoHoverTimer.Timer 004a1d27 UaarSales.exe ExtCtrls TTimer.WndProc 0047a7a0 UaarSales.exe 类 StdWndProc 7e4196c2 USER32.dll DispatchMessageA 004da230 UaarSales.exe 形成 TApplication.ProcessMessage 004da26a UaarSales.exe 表单 TApplication.HandleMessage 004da55f UaarSales.exe 形成 TApplication.Run 00b3ea76 UaarSales.exe UaarSales 117 初始化这是定时器程序
procedure TtaoHoverTimer.Timer;
var
lPos: TPoint;
begin
lPos := Mouse.CursorPos; // this is line 3999
if (lPos.X = FMousePos.X) and (lPos.Y = FMousePos.Y) and
not ((lPos.X = FOutdatedPos.X) and (lPos.Y = FOutdatedPos.Y)) then
begin
inherited Timer;
FOutdatedPos := Point(MaxInt, MaxInt);
end;
Enabled := False;
end;
【问题讨论】:
-
可能是用户退出了,输入的桌面和当前的桌面已经不一样了,所以GetCursorPostion失败了。
-
您的应用程序是否在虚拟机 (VMWare) 上运行?
-
@jn - 好的,但是如果用户已注销,我的应用程序如何仍在运行?
-
@ErvinS - 我使用 Microsoft Virtual PC 测试我的应用程序。我在那里没有任何问题。
-
另一个输入桌面可能已激活的原因有多种(快速用户切换或受密码保护的屏幕保护程序,仅举两个例子)。我只需将第 3999 行中的“Mouse.CursorPos”替换为“Windows.GetCursorPos”,并在失败时将 Enabled 设置为 False。