2

WindowsCEプラットフォーム(カスタムビルド)では、C#GUIは通常のフォームを使用して「ポップアップメニュー」を表示します。フォームコントロールを表示したくないので、 FormBorderstyleNoneに設定します。

一部のクライアントは、しばらくして「灰色のボックス」を報告しました。ここでいくつかのテストを行った後、問題を非常に速く再現できました。2つの異なるメニュー(フォーム)を常に開くと、プラットフォームはネイティブの例外を表示します。

エラー
Tiger.CEHost.exeでネイティブ例外が発生しました。[終了]を選択してからこのプログラムを再起動するか、[詳細]を選択して詳細を確認してください。

詳細:

エラー
ExceptionCode:0xC0000005
ExceptionAdress:0x00000001
読み取り:0x00000001

WL.SetSTyle(IntPtr hwnThis、UInt32 dwMask、UInt32 dwStyle)
at Form._SetBorderStyle(AGL_WINDOWSTYLE wstyVal、AGL_WINDOWSTYLE wstyMask)
at Form.set_FormBorderStyle(FormBorderStyle value)
at pDropDown.PopupForm.Show()
at
pDropDown ShowHideDropDown()
at pButton.OnClick(EventArgs e)
at Control.WnProc(WM wm、Int32 wParam、Int32 lParam)
at Control._InternalWnProc(WM wm、Int32 wParam、Int32 lParam)
at EVL.EnterMainLoop(IntPtr hwnMain)atApplication

Program.Main(String [] args)でRun(Form fm )

FormBorderStyleプロパティでは常に失敗するようです。一部のメモリが上書きされた可能性があるため、すでにすべてのpInvokesを削除しようとしましたが、これは役に立ちませんでした。

また、Showメソッドへの各呼び出しをログに記録し、各呼び出しはGUIスレッドで行われ、フォームには有効なハンドルが含まれています。

4

2 に答える 2

1

これは見たことがないので、CF やアプリで問題になる可能性は低いと思われがちです。

デバイスにアプリを実行するのに十分なメモリがありますか? メモリ不足の状態は OOM をスローする必要がありますが、他のあまり予測不可能なことを行うのを見たので、常に最初に確認する必要があります。

メモリが問題でない場合、それはプラットフォームの問題ではないという確信がありますか? OS の大部分は OEM によって開発されているため、OS の問題を除外することはできません。

私は2つのことを試してみます:

  1. 同じアプリが他のハードウェア (エミュレーターも含む) で問題なく動作しますか? 他のハードウェアで動作する場合は、プラットフォームが問題であることを強く示唆しています。

  2. C# の小さなアプリで再現するのはかなり簡単なので、同じ機能アイテムを実行する C/C++ でアプリをビルドして、動作するか、同じ問題が発生するかどうかを確認することをお勧めします。

于 2010-10-25T14:22:33.550 に答える
0

netcfagl3_5.dll のバグのようです (Microsoft に通知します)。

pinvokes (SetWindowLong) を使用して FormBorderstyle を設定すると、問題を再現できません。

このまれなバグが発生した場合に備えて、これは .net FormBorderStyleプロパティを使用せずに 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);
于 2010-10-27T08:26:10.843 に答える