none
[Windows 7] 未実装項目へのSystemParametersInfo戻り値がBOOLでない RRS feed

  • 質問

  • Windows 8用の設定値を参照するコードを動かしてみたところ、戻り値にNTSTATUSか何か、妙な値が返ってきました。

        bRet0 = SystemParametersInfo( SPI_GETCONTACTVISUALIZATION, 0, &contact, 0 );
        bRet1 = SystemParametersInfo( SPI_GETGESTUREVISUALIZATION, 0, &gesture, 0 );

    こうするといずれも、0xc0000002という値が返ります。Windows 7 SP1 x64にて。

    contact、gestureいずれも値が変化しませんので、失敗であるはずですからFALSEが返らなければならない場面です。NTSTATUSだとすればSTATUS_NOT_IMPLEMENTEDですが。

    SPI_SETCONTACTVISUALIZATION、SPI_SETGESTUREVISUALIZATIONでも0xc0000002となっています(余談ですがこのSETはドキュメントではポインタを指定せよとありますが、実際はLPVOIDキャストのULONG値でした/Win8 x86にて)。

    なおVista SP2 x86では正常にFALSEでした。

    もちろんOSのバージョンを判別して迂回すればいいのですが、報告として上げておきます。

    2012年11月29日 1:30

回答

  • 1.0xC0000002が戻り値に戻ったのか、contactに戻ったのかがあいまいです。
     以下は「戻り値に戻った」を仮定します。

    2.マニュアルによると当該関数は「0:失敗」又は「非0:成功」を戻すとあります。
     0以外の値に種別の定義はありませんので、「非0」の個々の値を
     評価することは無意味です。

    3.次に、掲載されているコードにはcontactの定義がありません。
     例えば、仮に
      ULONG contact=0;
     の様に初期化している場合、contactにCONTACTVISUALIZATION_OFF
     が戻った可能性を否定できません。(つまり成功した)

    以上を勘案すると、文面に提示された部分だけでは
    「FALSEが戻るべきである」という根拠が、やや乏しいとの印象を持ちます。
    いかがでしょうか。

    2012年11月29日 5:28
  • undocumentedなパラメーターだってあるでしょうから、未定義値を渡したら必ずエラーになるとは限らないと思います。

    ただし、SystemParametersInfo functionのSPI_GETCONTACTVISUALIZATIONの項目にWindows 8以降という記述がないのはドキュメントミスだとは思います。(文字通り解釈したらWindows 2000以降で使えることになってしまいますね。)

    • 回答の候補に設定 佐伯玲 2012年12月13日 2:53
    • 回答としてマーク 佐伯玲 2012年12月20日 6:33
    2012年11月29日 7:06

すべての返信

  • 1.0xC0000002が戻り値に戻ったのか、contactに戻ったのかがあいまいです。
     以下は「戻り値に戻った」を仮定します。

    2.マニュアルによると当該関数は「0:失敗」又は「非0:成功」を戻すとあります。
     0以外の値に種別の定義はありませんので、「非0」の個々の値を
     評価することは無意味です。

    3.次に、掲載されているコードにはcontactの定義がありません。
     例えば、仮に
      ULONG contact=0;
     の様に初期化している場合、contactにCONTACTVISUALIZATION_OFF
     が戻った可能性を否定できません。(つまり成功した)

    以上を勘案すると、文面に提示された部分だけでは
    「FALSEが戻るべきである」という根拠が、やや乏しいとの印象を持ちます。
    いかがでしょうか。

    2012年11月29日 5:28
  • undocumentedなパラメーターだってあるでしょうから、未定義値を渡したら必ずエラーになるとは限らないと思います。

    ただし、SystemParametersInfo functionのSPI_GETCONTACTVISUALIZATIONの項目にWindows 8以降という記述がないのはドキュメントミスだとは思います。(文字通り解釈したらWindows 2000以降で使えることになってしまいますね。)

    • 回答の候補に設定 佐伯玲 2012年12月13日 2:53
    • 回答としてマーク 佐伯玲 2012年12月20日 6:33
    2012年11月29日 7:06
  • こんにちは、mychro さん
    フォーラムオペレータの佐伯 玲 です。

    その後の状況はいかがでしょうか?
    仲澤@失業者 さん、佐祐理 さんから情報が寄せられています。

    情報をご確認の上、ご返信いただけましたらと思います。

    宜しくお願い致します。
    __________________________
    日本マイクロソフト株式会社 フォーラム オペレータ 佐伯 玲

    2012年12月6日 4:28