Delphi 2010中的ASyncPro 5.00-范围检查错误
正在尝试在D2010中运行AsyncPro。使用SourceForge的5.00版本 下面的AsyncPro代码(在OOMisc.pas中)失败,下面的MakeLong行中出现范围检查错误。我不知道如何开始调试这个 是否有人在D2010中运行ASyncPro,或者对下面可能发生的事情有一些了解?我在SourceForge上的一篇帖子没有得到任何回应Delphi 2010中的ASyncPro 5.00-范围检查错误,delphi,turbopower,Delphi,Turbopower,正在尝试在D2010中运行AsyncPro。使用SourceForge的5.00版本 下面的AsyncPro代码(在OOMisc.pas中)失败,下面的MakeLong行中出现范围检查错误。我不知道如何开始调试这个 是否有人在D2010中运行ASyncPro,或者对下面可能发生的事情有一些了解?我在SourceForge上的一篇帖子没有得到任何回应 function SafeYield : LongInt; {-Allow other processes a chance to run} v
function SafeYield : LongInt;
{-Allow other processes a chance to run}
var
Msg : TMsg;
begin
SafeYield := 0;
if PeekMessage(Msg, 0, 0, 0, PM_REMOVE) then begin
if Msg.Message = wm_Quit then
{Re-post quit message so main message loop will terminate}
PostQuitMessage(Msg.WParam)
else begin
TranslateMessage(Msg);
DispatchMessage(Msg);
end;
{Return message so caller can act on message if necessary}
SafeYield := MAKELONG(Msg.Message, Msg.hwnd); // Range Check Error on this line!
end;
end;
TIA鉴于MAKELONG需要两个Word类型的参数(16位),而Msg.Message和Msg.HWnd都是32位,因此出现范围检查错误也就不足为奇了。一般来说,窗口消息小于8000美元,因此我怀疑值是否是问题所在。但是,HWnd的整数值可以覆盖整个地图,并且经常大于$FFFF。由于这个原因,上面的代码没有真正意义,除了它似乎是16位版本的遗留工件 由于启用了范围检查,因此它清楚地强调了上述代码需要重新思考的事实。在Win32中,您不能再将消息值和窗口句柄放入32位
我希望我已经给了你一些关于如何进行的提示。如果不考虑调用此函数的代码,则不可能建议替代实现。您似乎在编译代码时启用了范围检查:
{$R+}
function Test(A, B: LongWord): LongInt;
begin
Result:= MakeLong(A,B);
// Project .. raised exception class ERangeError with message 'Range check error'.
end;
您可以关闭范围检查以消除运行时错误,但是
SafeYield := MAKELONG(Msg.Message, Msg.hwnd)
如果其中一个参数(或两者)高于2^16-1,则不正确
看起来代码是从16位AsyncPro版本移植到32位版本的,并且在所有32位AsyncPro版本中都存在bug。我会回应Allen的评论,但会更进一步。 如果查看代码的使用方式(也查看OoMisc中的DelayTicks),调用者要么认为返回值不重要,要么只是消息。将Msg.hwnd添加到号码中不仅行不通,而且也不是呼叫者所期望的
repeat
if Yield then
Res := SafeYield;
until (**Res = wm_Quit**) or TimerExpired(ET);
此代码只需要一条消息
我会换电话
SafeYield := MAKELONG(Msg.Message, Msg.hwnd);
到
(1) 该代码是一个消息泵,并且
(2) (在上下文中)它受R编译器指令的保护。范围检查已关闭:{$R-无范围检查}在AwDefine.inc中
因此(1)如果其他消息导致代码停止,则当消息通过时,代码将停止,并且
(2) 范围检查错误不是从这里来的
这表明异步进程正在导致范围检查异常或模式消息。在我使用的Delphi版本中,范围检查错误(和列表索引消息)不提供任何源代码/调试信息,因此我只能建议该错误可能与异步Comm事件,甚至与Get-focus/lost-focus/activate/paint事件相关联
SafeYield := Msg.Message;