none
Shell_NotifyIcon がエラー 0 を返す RRS feed

  • 全般的な情報交換

  • Shell_NotifyIcon() API が FALSE を返した場合は、通常失敗とみなしますが、その際、GetLastError() API が 0 を返す場合があって、そのケースでは本当に失敗したのか、それとも成功したとみなすべきなのか、皆さんはどう思われますか?

    今現在、自分は一応失敗とみなしてリトライするようなコードを書いていますが、大抵は最初で FALSE を返すと最後まで FALSE であることが多いようです

    実際のコードは以下のような感じです

    for (int j = 0; j < 5; j++) {
    	if (Shell_NotifyIcon(NIM_MODIFY, pData)) {
    		break;
    	} else {
    		logger.error(_T("Shell_NotifyIcon failed by %d"), GetLastError());
    	}
    	Sleep(500);
    }

    このコードで実行してみると、多くのPCでエラーログが5回も出てしまいます(もちろん必ずではなく、出る日も出ない日もあります)

    ただし、ほとんどの場合、見た目は成功しているように見えるので、ユーザからは、アイコンが変わらないという苦情が来たことは今のところありません

    そうしたことから、 GetLastError()==0 の場合は成功とみなしてもいいのではないかという疑問が湧いてきているのです

    ちなみに、XP の頃はこうしたことに出会った記憶はなく、Windows 7 に移行してから起こるようになった気がしています



    • 編集済み ishizawa 2014年5月28日 19:56
    • 種類を変更済み ishizawa 2014年5月30日 18:19 直接的な回答を求めたいのではなく、他の意見を聞いてみたかったから
    2014年5月28日 19:51

すべての返信

  • そもそも、Shell_NotifyIcon functionの解説にはGetLastErrorを使って詳細を取得できるとは一切書いていませんが……。

    上記ページの下の方のCommunity Additionsで、GetLastErrorが0を返すケースについての言及がありますね。

    2014年5月28日 23:58
  • ここの説明だと、GetLastError()は有意な戻り値を戻すような説明ですね。

    http://support.microsoft.com/kb/418138/ja

    なお、タイムアウト判定は4秒との記述もあります。

    2014年5月29日 2:08
  • 補足で、タイムアウトにはSendMessageTimeout()が内部で使われているらしいですが、タイムアウトした場合にGetLastError()が0を返すこともあるそうで。
    # Windows 2000についての言及になっていますが、このページにはWindows XP以降についての記述がないですね。多くのページはMinimum supported clientがWindows XPに更新されているというのに。
    2014年5月29日 4:42
  • 状況分析は返信されてるので、個人見解を...

    Shell_NotifyIcon() API が FALSE を返した場合は、通常失敗とみなしますが、その際、GetLastError() API が 0 を返す場合があって、そのケースでは本当に失敗したのか、それとも成功したとみなすべきなのか、皆さんはどう思われますか?

    普通に考えて API の戻り値を信頼するべきでしょう。GetLastError は捕捉情報のようなものですし...。

    Hongliang 様の指摘を見る限り 0 を返す状況もあるみたいですから・・・。(SendMessageTimeout が 0 セットするせいで ERROR_TIMEOUT を取得できない感じなのでタイムアウトなのでしょうね。)


    ただし、ほとんどの場合、見た目は成功しているように見えるので、ユーザからは、アイコンが変わらないという苦情が来たことは今のところありません

    そうしたことから、 GetLastError()==0 の場合は成功とみなしてもいいのではないかという疑問が湧いてきているのです

    メッセージ送信後の処理応答タイムアウトという状況でしょうから、シェルに届いてる場合は成功時と同結果でおかしくないです。

    しかし応答タイムアウトは状態不明と考えるべきで、失敗と考えるのが妥当ではないですかね?


    ちなみに、XP の頃はこうしたことに出会った記憶はなく、Windows 7 に移行してから起こるようになった気がしています

    ほとんど別シェルですから Win7 からの現象かもしれませんが、自分はこの現象に遭遇した事はありません。(Shell_Notify 使うのが、ほぼ皆無というのが大きいでしょうけど)

    しかし、XP 基準が続くのは困ったものです・・・。


    2014年5月29日 7:55