Иногда мое приложение получает ошибку ниже.
Обычно это происходит, когда пользователь отходит от своего стола, оставляя мою программу открытой. Когда они возвращаются, эта ошибка появилась.
TMouse.GetCursorPostion не делает ничего, кроме вызова API-интерфейса Windows для GetCursorPosition. Затем он проверяет возвращаемое значение и вызывает GetLastError, если это не удалось.
«Сбой вызова функции ОС» не очень помогает отследить причину этого. Может ли вызывать эту ошибку экранную заставку или спящий режим? Я мог бы изменить компонент так, чтобы он просто перехватывал и игнорировал ошибку, но, если это возможно, я бы предпочел знать, что / почему это происходит в первую очередь.
Мое приложение использует Delphi 2007, и вызов выполняется из компонента Transfer @ Once (v 1.7) Quasidata.
Вот стек вызовов:
operating system : Windows XP Service Pack 3 build 2600
exception number : 1
exception class : EOSError
exception message : A call to an OS function failed.
main thread ($d34):
0045e208 UaarSales.exe SysUtils RaiseLastOSError
0045e191 UaarSales.exe SysUtils RaiseLastOSError
0045e237 UaarSales.exe SysUtils Win32Check
004c6de9 UaarSales.exe Controls TMouse.GetCursorPos
00736d8b UaarSales.exe taoCntrr 3999 TtaoHoverTimer.Timer
004a1d27 UaarSales.exe ExtCtrls TTimer.WndProc
0047a7a0 UaarSales.exe Classes StdWndProc
7e4196c2 USER32.dll DispatchMessageA
004da230 UaarSales.exe Forms TApplication.ProcessMessage
004da26a UaarSales.exe Forms TApplication.HandleMessage
004da55f UaarSales.exe Forms TApplication.Run
00b3ea76 UaarSales.exe UaarSales 117 initialization
Вот процедура таймера
procedure TtaoHoverTimer.Timer;
var
lPos: TPoint;
begin
lPos := Mouse.CursorPos; <b> // this is line 3999 </b>
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;