STNodeEditor icon indicating copy to clipboard operation
STNodeEditor copied to clipboard

关于鼠标移动时候的System.OverflowException异常,已解决

Open Isaac320 opened this issue 7 months ago • 3 comments

我找了下源码,看到有一处类型转换会报这种异常 在STNodeEditor.cs类的第634行 Point pt = new Point(((int)m.LParam) >> 16, (ushort)m.LParam); 这里的强制转换会报算术运算溢出 改成下面这样写就兼容了 int x = (short)((m.LParam.ToInt64() >> 16) & 0xFFFF); int y = (short)(m.LParam.ToInt64() & 0xFFFF); Point pt = new Point(x, y);

Isaac320 avatar May 26 '25 02:05 Isaac320

我找了下源码,看到有一处类型转换会报这种异常 在STNodeEditor.cs类的第634行 Point pt = new Point(((int)m.LParam) >> 16, (ushort)m.LParam); 这里的强制转换会报算术运算溢出 改成下面这样写就兼容了 int x = (short)((m.LParam.ToInt64() >> 16) & 0xFFFF); int y = (short)(m.LParam.ToInt64() & 0xFFFF); Point pt = new Point(x, y);

LParam是一个IntPtr(指针)类型,如果是32位程序那么是4字节 64位程序则是8字节。。本质上来说还是一个数字。。讲道理 数字之前强转应该是不会有问题的。。并且我试了一下

        Console.WriteLine(IntPtr.Size);
        var p = (IntPtr)(0x00000000_00FF00FF);
        var i = (int)p;
        var us = (ushort)p;

但是并没有报错。。。所以我也是懵的。。。

DebugST avatar May 26 '25 08:05 DebugST

我找了下源码,看到有一处类型转换会报这种异常 在STNodeEditor.cs类的第634行 Point pt = new Point(((int)m.LParam) >> 16, (ushort)m.LParam); 这里的强制转换会报算术运算溢出 改成下面这样写就兼容了 int x = (short)((m.LParam.ToInt64() >> 16) & 0xFFFF); int y = (short)(m.LParam.ToInt64() & 0xFFFF); Point pt = new Point(x, y);

LParam是一个IntPtr(指针)类型,如果是32位程序那么是4字节 64位程序则是8字节。。本质上来说还是一个数字。。讲道理 数字之前强转应该是不会有问题的。。并且我试了一下

    Console.WriteLine(IntPtr.Size);
    var p = (IntPtr)(0x00000000_00FF00FF);
    var i = (int)p;
    var us = (ushort)p;

但是并没有报错。。。所以我也是懵的。。。

试试这个 0x000000b53eefb680

Isaac320 avatar May 27 '25 05:05 Isaac320

我找了下源码,看到有一处类型转换会报这种异常 在STNodeEditor.cs类的第634行 Point pt = new Point(((int)m.LParam) >> 16, (ushort)m.LParam); 这里的强制转换会报算术运算溢出 改成下面这样写就兼容了 int x = (short)((m.LParam.ToInt64() >> 16) & 0xFFFF); int y = (short)(m.LParam.ToInt64() & 0xFFFF); Point pt = new Point(x, y);

LParam是一个IntPtr(指针)类型,如果是32位程序那么是4字节 64位程序则是8字节。。本质上来说还是一个数字。。讲道理 数字之前强转应该是不会有问题的。。并且我试了一下

    Console.WriteLine(IntPtr.Size);
    var p = (IntPtr)(0x00000000_00FF00FF);
    var i = (int)p;
    var us = (ushort)p;

但是并没有报错。。。所以我也是懵的。。。

试试这个 0x000000b53eefb680

在.NET环境中没有任何问题 但是在X64的Framework环境中出现溢出。

DebugST avatar May 27 '25 08:05 DebugST