Pergunta

Em uma plataforma Windowsce (construção personalizada), nossa GUI C# usa formulários regulares para mostrar um "menu pop -up". Nós definimos o FormBordersTyle para Nenhum Como não queremos que os controles do formulário sejam visíveis.

Alguns clientes relataram "caixas cinzentas" depois de um tempo. Depois de alguns testes aqui, poderíamos reproduzir o problema rapidamente. Quando abrimos dois menus diferentes (formulários) constantemente, a plataforma nos mostra uma exceção nativa.

Erro
Uma exceção nativa ocorreu em tiger.cehost.exe. Selecione Deset e reinicie este programa ou selecione Detalhes para obter mais informações.

Os detalhes:

Erro
ExceptionCode: 0xc0000005
ExceptionAdress: 0x00000001
Leitura: 0x00000001

em wl.setstyle (intptr hwnThis, uint32 dwMask, uint32 dwstyle)
em form._setborderstyle (agl_windowstyle wstyval, agl_windowstyle wstymask)
em form.set_formborderstyle (valor de formborderstyle)
em pdropdown.popupform.show ()
em pdropdown.show ()
em pbutton.showhidedropdown ()
em pbutton.onclick (EventArgs e)
em Control.WnProc (WM WM, INT32 WPARAM, INT32 LPARAM)
em Control._internalhnproc (WM WM, INT32 WPARAM, INT32 LPARAM)
em EVL.Entermainloop (Intptr Hwnmain)
no Application.run (Formulário FM)
em program.main (string [] args)

Sempre parece falhar no FormBordersTyle propriedade. Já tentamos remover todos os pinvokes, pois talvez alguma memória tenha sido substituída, mas isso não ajudou.

Também registramos cada chamada para o método Show e cada chamada é feita no thread da GUI e o formulário contém uma alça válida.

Foi útil?

Solução 2

Parece ser um bug no netcfagl3_5.dll (notificará a Microsoft sobre isso)

Quando definimos o formbordersTyle usando pinvokes (setWindowlong), não podemos reproduzir o problema.

Caso alguém experimente esse bug raro, este é o código para definir o formbordersTyle sem usar o .NET FormBordersTyle propriedade.

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);

Outras dicas

Eu nunca vi isso, o que tende a me fazer pensar que é menos provável que seja um problema no CF ou até no seu aplicativo.

Seu dispositivo tem memória suficiente para executar o aplicativo? Uma condição de baixa memória deve jogar uma OOM, mas eu vi que ela fizer outras coisas menos predicatas, por isso é sempre a primeira coisa a verificar.

Se a memória não é o problema, você tem certeza de que não é um problema de plataforma? Lembre -se, como uma grande parte do sistema operacional é desenvolvida pelo OEM, você não pode descartar problemas no sistema operacional.

Eu tentaria duas coisas:

  1. O mesmo aplicativo é bom em algum outro hardware (até o emulador) sem problemas? Se funcionar em outro hardware, implica fortemente a plataforma como o problema.

  2. Como é bastante fácil reproduzir com um pequeno aplicativo em C#, eu recomendo a criação de um aplicativo em C/C ++ que faça os mesmos itens funcionais para ver se ele se comporta ou fornece o mesmo problema.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top