Form.FormBorderStyle Нарушение доступа к собственному исключению

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

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

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

Детали:

Error
ExceptionCode: 0xC0000005
ExceptionAdress: 0x00000001
Чтение: 0x00000001

at WL.SetSTyle(IntPtr hwnThis, UInt32 dwMask, UInt32 dwStyle)
at Form._SetBorderStyle(AGL_WINDOWSTYLE wstyVal, AGL_WINDOWSTYLE wstyMask)
at Form.set_FormBorderStyle(значение FormBorderStyle)
at pDropDown.PopupForm.ShowForm.ShowForm.
в 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, и каждый вызов выполняется в потоке графического интерфейса пользователя, а форма содержит допустимый дескриптор.


person Stormenet    schedule 25.10.2010    source источник


Ответы (2)


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

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

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

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

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

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

person ctacke    schedule 25.10.2010
comment
Память не проблема, а ОС встроенная. Однажды я протестировал более старую версию ОС, и потребовалось больше времени, чтобы достичь исключения. Я буду искать более старые версии ОС, чтобы посмотреть, устранят ли они проблему. Это также не так просто воспроизвести с небольшим приложением, некоторые вещи должны быть запущены, чтобы это произошло (не уверен, что оно должно работать, чтобы это произошло вообще, или если это произойдет быстрее, мне нужно провести более длительные тесты для этого) - person Stormenet; 25.10.2010
comment
Что ж, проблема, похоже, в dll .net AGL, посмотрите мой ответ, если вам интересно. И спасибо за ваш вклад. - person Stormenet; 27.10.2010

Похоже, ошибка в netcfagl3_5.dll (уведомит Microsoft об этом)

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

На случай, если кто-то столкнется с этой редкой ошибкой, вот код для установки стиля формы без использования свойства .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);
person Stormenet    schedule 27.10.2010
comment
Была ли когда-нибудь статья в КБ или что-нибудь, написанное по этому поводу? - person JoelHess; 18.03.2011
comment
@JoelHess, нет, в тот момент не было времени, и я честно забыл об этом. - person Stormenet; 18.03.2011