Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 2010中的ASyncPro 5.00-范围检查错误_Delphi_Turbopower - Fatal编程技术网

Delphi 2010中的ASyncPro 5.00-范围检查错误

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

正在尝试在D2010中运行AsyncPro。使用SourceForge的5.00版本

下面的AsyncPro代码(在OOMisc.pas中)失败,下面的MakeLong行中出现范围检查错误。我不知道如何开始调试这个

是否有人在D2010中运行ASyncPro,或者对下面可能发生的事情有一些了解?我在SourceForge上的一篇帖子没有得到任何回应

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;