2019年10月21日月曜日

【未解決】CSVダウンロードを行うと、ブラウザ(Edge)がクラッシュする

自社製品で発生した事象。未解決です。

事象

CSVダウンロードを行うと、ブラウザ(Edge)がクラッシュする

Windowsのアプリケーションログ

障害が発生しているアプリケーション名: MicrosoftEdge.exe、バージョン: 11.0.18362.418、タイム スタンプ: 0x5d995b38
障害が発生しているモジュール名: EMODEL.dll、バージョン: 11.0.18362.418、タイム スタンプ: 0x5d9957cb
例外コード: 0xc0000409
障害オフセット: 0x000000000035b4f4
障害が発生しているプロセス ID: 0x3edc
障害が発生しているアプリケーションの開始時刻: 0x01d584b9670fceb4
障害が発生しているアプリケーション パス: C:\WINDOWS\SystemApps\Microsoft.MicrosoftEdge_8wekyb3d8bbwe\MicrosoftEdge.exe
障害が発生しているモジュール パス: C:\WINDOWS\SystemApps\Microsoft.MicrosoftEdge_8wekyb3d8bbwe\EMODEL.dll
レポート ID: 04e20477-ddaf-4338-bfe2-39c8d13a63e3
障害が発生しているパッケージの完全な名前: Microsoft.MicrosoftEdge_44.18362.387.0_neutral__8wekyb3d8bbwe
障害が発生しているパッケージに関連するアプリケーション ID: MicrosoftEdge

確認したこと

ポップアップブロック →元々Off
Windows Defender SmartScan → OnだったのでOff
他のCSVダウンロード可能なサイトにてダウンロード → 正常にダウンロードできる

まとめ(途中報告)

これ以降、まだ詳しくは調べていませんが、現時点考えられる可能性は2つ。
1.自社製品がCSVダウンロードの処理でクライアントへ送っているレスポンスに不備
2.Edgeのバグ

1については開発者ツールで追えそうもないのでパケットキャプチャになりそう。
2については、まだネット上にも情報が足りないので、断定はできなさそう。

時期を見て、1については詳細調査を行いたいと思ってます。

2019年10月18日金曜日

【.netFramework】フォーム継承利用時のイベントハンドラの処理順

ある程度のシステムになると、基底フォームを作成して共通処理を実装し、個別は継承先のフォームで実装する。というケースが多くなると思います。

キーボードイベントの処理順がうまくいかないと技術者から聞かれ、過去の記憶を確認すべく、サンプル書いて確認しました。(サンプルコード(zip)は記事の一番下に置いてあります)

【結果】

OnKey****の場合、継承先から順番に処理される。(上書き用途)
Key****のイベントハンドラの場合、基底から処理される

なお、本検証結果は「一般的な実装方法を用いた場合」の結果であり、色々とコードで工夫をなさった場合にはこの限りではありません。例)On***系の実装でbase.On***を呼ばない。とか、基底のイベントハンドラを登録するタイミングを継承先で指定するなど、振る舞いを変える方法はあると思います。

【検証した方法】

1.以下3つのフォームを用意する
  ・基底フォーム (TestBaseForm)
  ・基底を継承したフォーム (InheritForm1)
  ・さらに継承したフォーム(InheritInheritForm2)
2.それぞれに、同じメソッド、イベントを実装
3.プログラムを実行して、順番を把握

【実装イメージ】

【テストコード】


/// 同じコードを継承先のフォームにも記載
public partial class TestBaseForm : Form
{
    string _myFormName = "TestBaseForm"; // ここは実装するフォーム名にする
    public TestBaseForm()
    {
        InitializeComponent();
        this.KeyPreview = true;
        this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.Form_KeyDown);
        this.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.Form_KeyPress);
        this.KeyUp += new KeyEventHandler(this.Form_KeyUp);
    }
    protected override void OnKeyDown(KeyEventArgs e)
    {
        System.Diagnostics.Debug.WriteLine(string.Format("{0}:{1}", _myFormName, System.Reflection.MethodBase.GetCurrentMethod().Name));
        base.OnKeyDown(e);
    }
    protected override void OnKeyPress(KeyPressEventArgs e)
    {
        System.Diagnostics.Debug.WriteLine(string.Format("{0}:{1}", _myFormName, System.Reflection.MethodBase.GetCurrentMethod().Name));
        base.OnKeyPress(e);
    }
    protected override void OnKeyUp(KeyEventArgs e)
    {
        System.Diagnostics.Debug.WriteLine(string.Format("{0}:{1}", _myFormName, System.Reflection.MethodBase.GetCurrentMethod().Name));
        base.OnKeyUp(e);
    }
    private void Form_KeyDown(object sender, KeyEventArgs e)
    {
        System.Diagnostics.Debug.WriteLine(string.Format("{0}:{1}", _myFormName, System.Reflection.MethodBase.GetCurrentMethod().Name));
    }
    private void Form_KeyUp(object sender, KeyEventArgs e)
    {
        System.Diagnostics.Debug.WriteLine(string.Format("{0}:{1}", _myFormName, System.Reflection.MethodBase.GetCurrentMethod().Name));
    }
    private void Form_KeyPress(object sender, KeyPressEventArgs e)
    {
        System.Diagnostics.Debug.WriteLine(string.Format("{0}:{1}", _myFormName, System.Reflection.MethodBase.GetCurrentMethod().Name));
    }
}

【実行ログ】

Log内容 Method 基底 継承1 継承2
InheritInheritForm2:OnKeyDown OnKeyDown    
InheritForm1:OnKeyDown OnKeyDown    
TestBaseForm:OnKeyDown OnKeyDown    
TestBaseForm:Form_KeyDown KeyDown    
InheritForm1:Form_KeyDown KeyDown    
InheritInheritForm2:Form_KeyDown KeyDown    
InheritInheritForm2:OnKeyPress OnKeyPress    
InheritForm1:OnKeyPress OnKeyPress    
TestBaseForm:OnKeyPress OnKeyPress    
TestBaseForm:Form_KeyPress KeyPress    
InheritForm1:Form_KeyPress KeyPress    
InheritInheritForm2:Form_KeyPress KeyPress    
InheritInheritForm2:OnKeyUp OnKeyUp    
InheritForm1:OnKeyUp OnKeyUp    
TestBaseForm:OnKeyUp OnKeyUp    
TestBaseForm:Form_KeyUp KeyUp    
InheritForm1:Form_KeyUp KeyUp    
InheritInheritForm2:Form_KeyUp KeyUp    

【まとめ】

フォームを継承して利用する際には、継承元に実装するロジックの用途、継承先での振る舞いを考慮したうえで実装を決めることをお勧めします。

【ソース】

20191018_KeyboardEventOrderTest_source.zip

2019年10月14日月曜日

WindowsUpdateでprintspoolerが起動しなくなった

保守案件です。Windows10で印刷ができなくなる事象に対する一部始終です。

【経緯】

・ある特定のPCでのみ発生。
・事象としては印刷ができない。
・ドライバなどを入れなおす。など試してみてもらってもダメ、SE保守となりました。

【把握できていること】

・プリンタスプーラサービス(Print Spooler)が停止している。
・サービスを手動で起動しても、暫くたつと停止してしまう。

【こちらで把握したこと】

・イベントビューアで、エラー状況を確認。2019/10/04よりPrintSpoolerがエラーを出しているようです。
・WindowsUpdateが最後に動いたのが2019/10/04
・ネットで「printspooler 停止してしまう windows10」で調べたところ、2019年9月4週に発信されたWindowsUpdateによる事象で、Microsoftも把握しているとの事。

【処置】

・WindowsUpdate  →「最新です」とはなっていたが、「最新を取得」でいくつかモジュールがインストールされました。OSの再起動を求められたので再起動
・WindowsUpdate(2回目)  →おなじく、「最新です」となっていたのですが、「最新を取得」でいくつかモジュールがインストールされました。1回目と同じで、net Frameworkのパッチなのが気になる。。。
・再起動後も現象は変わらず。 KB4524148を当てろ。という情報があり、当てようとしても、既にインストールされている。 https://www.catalog.update.microsoft.com/Search.aspx?q=KB4524148%20
・「KB4524148」で調べると新情報。 KB4524148をアンインストールしてください。と。

【結果】

・「KB4524148」をアンインストールすることで正常に動作するようになりました。