2010-10-25 4 views
2

На платформе WindowsCE (пользовательская сборка) наш C# gui использует обычные формы для отображения «всплывающего меню». Мы установили FormBorderstyle на номер Нет, так как мы не хотим, чтобы элементы управления формы были видимыми.Form.FormBorderStyle Native Exception Нарушение прав доступа

Некоторые клиенты сообщили «Серые коробки» через некоторое время. После некоторого тестирования здесь мы могли бы быстро воспроизвести проблему. Когда мы открываем 2 разных меню (формы) постоянно, платформа показывает нам собственное исключение.

Ошибка
Нативное исключение произошло в Tiger.CEHost.exe. Выберите «Выход» и , затем перезапустите эту программу или выберите . Подробности для получения дополнительной информации.

Детали:

Ошибка
ExceptionCode: 0xC0000005
ExceptionAdress: 0x00000001
Reading: 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 е)
в контроле. WnProc (WM WM, Int32 WPARAM, Int32 LPARAM)
в Control._InternalWnProc (WM WM, Int32, Int32 wParam'а, LPARAM)
на EVL.EnterMainLoop (IntPtr hwnMain)
в Application.Run (Форма Fm)
на Program.Main (String [] args)

Кажется, что это всегда сбой в собственности FormBorderStyle. Мы уже пытались удалить все pInvokes, поскольку, возможно, некоторая память была перезаписана, но это не помогло.

Мы также регистрируем каждый вызов метода Show, и каждый вызов выполняется в потоке gui, а Form содержит действительный дескриптор.

ответ

0

Это кажется ошибка в netcfagl3_5.dll (уведомляет Microsoft об этом)

Когда мы устанавливаем FormBorderstyle используя pinvokes (SetWindowLong) мы не можем воспроизвести проблему.

В случае, если кто-то испытывает эту редкую ошибку, это код для установки стиля 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

+0

@ JoelHess, нет, не было времени в тот момент и честно забыл об этом. – Stormenet

1

Я никогда не видел этого, что, как правило, заставляет меня думать, что это менее вероятно, будет проблемой в CF или даже вашем приложении.

У вашего устройства достаточно памяти для запуска приложения? Условие с низкой памятью должно бросать OOM, но я видел, как он делает другие, менее предикатные вещи, поэтому всегда нужно проверять первое.

Если память не является проблемой, вы уверены, что это не проблема платформы? Помните, так как большая часть ОС разработана OEM, вы не можете исключать проблемы в ОС.

Я хотел бы попробовать две вещи:

  1. ли то же самое приложение прекрасно работать на некоторых других аппаратных средств (даже эмулятор) без проблем? Если он работает на другом оборудовании, он в значительной степени подразумевает платформу как проблему.

  2. Поскольку это довольно легко воспроизвести с помощью небольшого приложения на C#, я бы рекомендовал создать приложение на C/C++, которое выполняет те же функциональные элементы, чтобы увидеть, ведет ли он себя или дает ту же проблему.

+0

Память не является проблемой, а ОС встроена. Я тестировал один раз с более старой версией ОС, и для достижения исключения потребовалось больше времени. Я буду искать более старые версии ОС, чтобы убедиться, что они устраняют проблему. Это также не так легко воспроизвести с помощью небольшого приложения, некоторые вещи должны быть запущены, чтобы это произошло (не уверен, что он должен быть запущен, чтобы это произошло вообще, или если это происходит быстрее, мне нужно делать более длительные тесты для этого) – Stormenet

+0

Ну, проблема, похоже, в DLL .net AGL, см. мой ответ, если вам интересно. И спасибо за ваш вклад. – Stormenet