Form.FormBorderStyle Собственное нарушение прав доступа - PullRequest
2 голосов
/ 25 октября 2010

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

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

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

Подробности:

Ошибка
Код исключения: 0xC0000005
Адрес исключения: 0x00000001
Чтение: 0x00000001

в WL.SetSTyle (IntPtr hwnThis, UInt32 dwMask, UInt32 dwStyle)
в Form._SetBorderStyle (AGL_WINDOWSTYLE
в 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 (форма fm)
вProgram.Main (String [] args)

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

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

Ответы [ 2 ]

1 голос
/ 25 октября 2010

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

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

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

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

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

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

0 голосов
/ 27 октября 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);
...