【问题标题】:Form.FormBorderStyle Native Exception Access violationForm.FormBorderStyle 本机异常访问冲突
【发布时间】:2010-10-27 16:26:10
【问题描述】:

在 WindowsCE 平台(自定义构建)上,我们的 C# gui 使用常规表单来显示“弹出菜单”。 我们将 FormBorderstyle 设置为 None,因为我们不希望表单控件可见。

一段时间后,一些客户报告“灰色框”。 在这里进行一些测试后,我们可以很快地重现该问题。当我们不断打开 2 个不同的菜单(表单)时,平台会向我们显示本机异常。

错误
发生本机异常 在 Tiger.CEHost.exe 中。选择退出并 然后重新启动该程序,或选择 详情了解详情。

详情:

错误
异常代码:0xC0000005
异常地址:0x00000001
读取:0x00000001

在 WL.SetSTyle(IntPtr hwnThis, UInt32 dwMask, UInt32 dwStyle)
在 Form._SetBorderStyle(AGL_WINDOWSTYLE wstyVal, AGL_WINDOWSTYLE wstyMask)
在 Form.set_FormBorderStyle(FormBorderStyle 值)
在 pDropDown.PopupForm.Show()
在 pDropDown.Show()
在 pButton.ShowHideDropDown()
在 pButton.OnClick(EventArgs e)
在 Control.WnProc(WM wm, Int32 wParam, Int32 lParam)
在 Control._InternalWnProc(WM wm, Int32 wParam, Int32 lParam)
在 EVL.EnterMainLoop(IntPtr hwnMain)
在 Application.Run(Form fm)
在 Program.Main(String[] args)

FormBorderStyle 属性似乎总是​​失败。我们已经尝试删除所有 pInvokes,因为可能会覆盖一些内存,但这没有帮助。

我们还记录对 Show 方法的每次调用,每次调用都是在 gui 线程中进行的,并且 Form 包含一个有效的句柄。

【问题讨论】:

    标签: c# winforms compact-framework formborderstyle


    【解决方案1】:

    我从未见过这种情况,这让我认为它不太可能成为 CF 甚至您的应用程序中的问题。

    您的设备是否有足够的内存来运行应用程序?内存不足的情况应该会引发 OOM,但我已经看到它会做其他难以预测的事情,所以它始终是首先要检查的事情。

    如果内存不是问题,您确定不是平台问题吗?请记住,由于大部分操作系统是由 OEM 开发的,因此您不能排除操作系统存在问题。

    我会尝试两件事:

    1. 同一个应用程序在其他一些硬件(甚至是模拟器)上运行正常吗?如果它适用于其他硬件,则严重暗示该平台是问题所在。

    2. 由于在 C# 中使用小型应用程序进行复制相当容易,因此我建议使用 C/C++ 构建一个应用程序,该应用程序执行相同的功能项,以查看其行为或问题是否相同。

    【讨论】:

    • 内存不是问题,操作系统是内部构建的。我确实使用旧版本的操作系统进行了一次测试,但需要更长的时间才能达到异常。我将搜索旧版本的操作系统,看看是否能解决问题。用一个小应用程序重现也不是那么容易,有些事情需要运行才能发生(不确定它是否需要运行才能发生,或者如果它发生得更快,我需要做更长的测试为此)
    • 嗯,问题似乎出在 .net AGL dll 中,如果您有兴趣,请查看我的回答。感谢您的意见。
    【解决方案2】:

    这似乎是 netcfagl3_5.dll 中的错误(将通知 Microsoft)

    当我们使用 pinvokes (SetWindowLong) 设置 FormBorderstyle 时,我们无法重现该问题。

    如果有人遇到这种罕见的错误,这是在不使用 .net FormBorderStyle 属性的情况下设置 formborderstyle 的代码。

    private const uint WS_OVERLAPPED = 0x00000000;
            private const uint WS_POPUP = 0x80000000;
            private const uint WS_CHILD = 0x40000000;
            private const uint WS_MINIMIZE = 0x20000000;
            private const uint WS_VISIBLE = 0x10000000;
            private const uint WS_DISABLED = 0x08000000;
            private const uint WS_CLIPSIBLINGS = 0x04000000;
            private const uint WS_CLIPCHILDREN = 0x02000000;
            private const uint WS_MAXIMIZE = 0x01000000;
            private const uint WS_CAPTION = 0x00C00000;
            private const uint WS_BORDER = 0x00800000;
            private const uint WS_DLGFRAME = 0x00400000;
            private const uint WS_VSCROLL = 0x00200000;
            private const uint WS_HSCROLL = 0x00100000;
            private const uint WS_SYSMENU = 0x00080000;
            private const uint WS_THICKFRAME = 0x00040000;
            private const uint WS_GROUP = 0x00020000;
            private const uint WS_TABSTOP = 0x00010000;
    
            private const int WS_MINIMIZEBOX = 0x00020000;
            private const int WS_MAXIMIZEBOX = 0x00010000;
    
            private const uint WS_EX_DLGMODALFRAME = 0x00000001;
            private const uint WS_EX_NOPARENTNOTIFY = 0x00000004;
            private const uint WS_EX_TOPMOST = 0x00000008;
            private const uint WS_EX_ACCEPTFILES = 0x00000010;
            private const uint WS_EX_TRANSPARENT = 0x00000020;
            private const uint WS_EX_MDICHILD = 0x00000040;
            private const uint WS_EX_TOOLWINDOW = 0x00000080;
            private const uint WS_EX_WINDOWEDGE = 0x00000100;
            private const uint WS_EX_CLIENTEDGE = 0x00000200;
            private const uint WS_EX_CONTEXTHELP = 0x00000400;
            private const uint WS_EX_STATICEDGE = 0x00020000;
    
            private const int WS_EX_NOANIMATION = 0x04000000;
            public const int GWL_EX_STYLE = -20;
            public const int GWL_STYLE = (-16);
    
    public static void SetNoBorder(Form form) {
                RemoveFormStyle(form, GWL_STYLE, (int)(WS_CAPTION | WS_THICKFRAME | WS_MINIMIZE | WS_MAXIMIZE | WS_SYSMENU));
                RemoveFormStyle(form, GWL_EX_STYLE, (int)(WS_EX_DLGMODALFRAME | WS_EX_CLIENTEDGE | WS_EX_STATICEDGE));
            }
    
    public static void RemoveFormStyle(Form f, int modifier, int style) {
                int currStyle = GetWindowLong(f.Handle, GWL_EX_STYLE);
                currStyle &= ~style;
                SetWindowLong(f.Handle, modifier, currStyle);
            }
    
        [DllImport("Coredll.dll", SetLastError = true)]
        public static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong);
    
        [DllImport("coredll.dll", SetLastError = true)]
        public static extern int GetWindowLong(IntPtr hWnd, int nIndex);
    

    【讨论】:

    • 是否有任何知识库文章或任何关于此的文章?
    • @JoelHess,不,当时没有时间,老实说忘记了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-01
    • 2012-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多