2010-10-25 127 views
2

在WindowsCE平臺(自定義構建)上,我們的C#gui使用常規窗體來顯示「彈出菜單」。 我們將FormBorderstyle設置爲,因爲我們不希望窗體控件可見。Form.FormBorderStyle原生異常訪問衝突

一段時間後,一些客戶報告了「灰盒子」。 經過一些測試後,我們可以很快地重現問題。當我們不斷地打開2個不同的菜單(表單)時,平臺向我們展示了一個本地異常。

錯誤
一個土生土長的例外Tiger.CEHost.exe發生 。選擇退出並 然後重新啓動該程序,或選擇 詳細信息以獲取更多信息。

細節:

錯誤
ExceptionCode:0000005
ExceptionAdress:00000001
讀:00000001

在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的)
在控制。 WnProc(WM WM,的Int32 wParam中,的Int32 LPARAM)
在Control._InternalWnProc(WM WM,的Int32 wParam中,的Int32 LPARAM)
在EVL.EnterMainLoop(IntPtr的hwnMain)
在Application.Run(表格FM)
在Program.Main(String [] args)

它似乎總是在FormBorderStyle屬性失敗。我們已經嘗試刪除所有的pInvokes,因爲可能有些內存被覆蓋了,但這沒有幫助。

我們還記錄每個調用Show方法,每個調用都在gui線程中進行,並且Form包含一個有效的句柄。

回答

0

這似乎是在netcfagl3_5.dll一個bug(會通知微軟這個)

當我們使用pinvokes(SetWindowLong函數)設置FormBorderstyle我們無法重現該問題。

如果有人遇到這個罕見的錯誤,這是設置formborderstyle而不使用.net 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); 
+0

是否曾經有過一篇知識庫文章或者其他什麼文章? – JoelHess 2011-03-18 01:26:47

+0

@JoelHess,不,在那個時刻沒有時間,並且真的忘了它。 – Stormenet 2011-03-18 10:45:28

1

我從來沒有見過這個,這往往會讓我覺得它不太可能成爲CF甚至是你的應用程序的問題。

您的設備是否有足夠的內存來運行應用程序?低內存條件應該會拋出一個OOM,但我已經看到它做了其他可預測性較低的事情,所以它總是首先要檢查。

如果內存不是問題,你確定它不是平臺問題嗎?請記住,由於大部分操作系統是由OEM開發的,因此您不能排除操作系統中的問題。

我要做兩件事情:

  1. 是否在其他一些硬件(即使是仿真器)沒有問題的同一應用程序運行正常?如果它在其他硬件上工作,則會嚴重影響平臺的問題。由於在C#中使用小型應用程序進行再現相當容易,因此我建議在C/C++中構建一個應用程序,該應用程序執行相同的功能項目以查看其行爲或給出相同的問題。

+0

內存不是問題,操作系統是內部構建的。我使用舊版本的操作系統進行過一次測試,但遇到異常需要一段時間。我將搜索舊版本的操作系統,看看是否可以消除這個問題。使用小型應用程序再現也不是那麼容易,有些事情需要運行才能發生(不確定是否需要運行它才能發生,或者如果它發生得更快,我需要做更長時間的測試爲此) – Stormenet 2010-10-25 15:11:11

+0

好吧,問題似乎在.net AGL dll中,如果您有興趣,請參閱我的答案。並感謝您的意見。 – Stormenet 2010-10-27 08:27:02