2010-12-09 5 views
4

Der Versuch, AsyncPro in D2010 ausgeführt zu bekommen. Verwenden der Version 5.00 von Source Forge.ASyncPro 5.00 in Delphi 2010 - Bereichsüberprüfung Fehler

Der unten angegebene AsyncPro-Code (in OOMisc.pas) schlägt mit einem Bereichsprüfungsfehler in der folgenden MakeLong-Zeile fehl. Ich habe keine Ahnung, wie ich mit dem Debuggen anfangen soll.

Hat jemand ASyncPro in D2010 läuft, oder haben Sie einen Einblick in was unten geschehen könnte? Ein Posting von mir auf der SourceForge brachte keine Antworten.

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

Antwort

2

Es scheint, dass Sie den Code mit Bereichsprüfung auf kompilieren:

{$R+} 
function Test(A, B: LongWord): LongInt; 
begin 
    Result:= MakeLong(A,B); 
// Project .. raised exception class ERangeError with message 'Range check error'. 
end; 

Sie können Abhaken wechseln Bereich der Laufzeitfehler loszuwerden, aber das Ergebnis von

SafeYield := MAKELONG(Msg.Message, Msg.hwnd) 

ist falsch Wenn eines der Argumente (oder beide) über 2^16 - 1 ist.

Sieht aus wie der Code wurde von 16-Bit-AsyncPro-Version ohne Änderung in 32-Bit-Version portiert und der Fehler existierte wo t über alle 32-Bit-AsyncPro-Versionen.

1

Da, wie MAKELONG nimmt zwei Parameter vom Typ Wort (16 Bit) und Msg.Message und Msg.HWnd sind beide 32 Bit ist es nicht verwunderlich, dass Sie Range-Check-Fehler sind immer . Im Allgemeinen sind Fenstermeldungen < $ 8000, so bezweifle ich, dass der Wert das Problem ist. Der Integralwert eines HWnd kann jedoch überall auf der Karte sein und ist mit Sicherheit> $ FFFF. Aus diesem Grund macht der obige Code keinen wirklichen Sinn, abgesehen davon, dass es sich um ein Artefakt handelt, das vor langer Zeit von der 16-Bit-Version übriggeblieben ist.

Da die Bereichsüberprüfung aktiviert ist, wird deutlich, dass der obige Code ein wenig überarbeitet werden muss. In Win32 können Sie einen Nachrichtenwert und ein Fensterhandle in 32 Bit nicht mehr anpassen.

Ich hoffe, ich habe Ihnen ein paar Tipps gegeben, wie Sie vorgehen sollten. Ohne Berücksichtigung des Codes, der diese Funktion aufruft, ist es nicht möglich, eine alternative Implementierung vorzuschlagen.

1

Ich würde Allens Kommentar wiederholen - aber weiter gehen. Wenn Sie sich ansehen, wie der Code verwendet wird (Schauen Sie sich DelayTicks auch in OoMisc an), nehmen Anrufer entweder an, dass der Rückgabewert unwichtig ist oder JUST ist. Das Hinzufügen der Msg.hwnd zu der Nummer wird nicht nur nicht funktionieren, es ist auch nicht das, was die Anrufer erwarten.

repeat 
    if Yield then 
    Res := SafeYield; 
until (**Res = wm_Quit**) or TimerExpired(ET); 

Dieser Code erwartet nur eine Nachricht.

würde ich die Zeile

SafeYield := MAKELONG(Msg.Message, Msg.hwnd); 

zu

SafeYield := Msg.Message; 
0

(1) Dieser Code ist ein Nachrichtensystem, und

(2) (im Kontext) wird geschützt durch eine R-Compiler-Direktive. Die Bereichsüberprüfung ist ausgeschaltet: {$ R- Keine Bereichsüberprüfung} in AwDefine.inc

So (1) Wenn eine andere Nachricht, den Code zu stoppen verursacht, das ist, wo es sein wird, wenn die Nachricht durchläuft, und

(2) Die Range-Check-Fehler kommen nicht von hier.

Dies deutet darauf hin, dass ein asynchroner Prozess eine Bereichsüberprüfung-Ausnahme oder modale Nachricht verursacht. In der Version von Delphi, mit der ich arbeite, geben Bereichsüberprüfungsfehler (und Listenindexnachrichten) keine Quell-/Debuginformationen aus, so dass ich nur vorschlagen kann, dass der Fehler mit einem asynchronen Comm-Ereignis oder sogar einem focus/lost-focus/aktivieren/malen Ereignis.