在WindowsCE平台(自定义版本)上,我们的C#gui使用常规表单来显示“弹出菜单”。 我们将 FormBorderstyle 设置为无,因为我们不希望表单控件可见。
有些客户在一段时间后报告了“灰盒子”。 经过一些测试,我们可以很快地重现问题。当我们不断打开2个不同的菜单(表单)时,平台会向我们显示本机异常。
错误
发生了本机异常 在Tiger.CEHost.exe中。选择退出和 然后重启此程序,或选择 有关详细信息,请参阅详细信息。
细节:
错误
ExceptionCode:0xC0000005
ExceptionAdress: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包含一个有效的句柄。
答案 0 :(得分:1)
我从来没有见过这个,这往往让我觉得它不太可能成为CF甚至你的应用中的问题。
您的设备是否有足够的内存来运行应用程序?低内存条件应该抛出一个OOM,但我已经看到它做了其他的,不太可预测的事情,所以它总是第一件要检查。
如果内存不是问题,您确定它不是平台问题吗?请记住,由于操作系统的很大一部分是由OEM开发的,因此不能排除操作系统中的问题。
我会尝试两件事:
同一个应用程序在其他硬件(甚至模拟器)上运行正常吗?如果它适用于其他硬件,则会严重影响平台作为问题。
由于使用C#中的小应用程序进行重新编写相当容易,我建议使用C / C ++构建一个应用程序来执行相同的功能项,以查看它是否表现或给出相同的问题。
答案 1 :(得分:0)
这似乎是netcfagl3_5.dll中的一个错误(会通知微软)
当我们使用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);