none
EnumFontFamiliesEx関数の戻り値 RRS feed

  • 質問

  • 「EnumFontFamiliesEx関数の戻り値は、コールバック関数によって返される最後の値です」と記述されていますが、
    このコールバック関数が呼ばれないときの戻り値は何になるのでしょうか?
    2022年3月8日 4:44

回答

  • WindowsAPIマニュアル通りに解釈すれば、「コールバックが最後に戻した値」なので、
    「一度もコールバックが呼ばれない」ということは「あり得ない」と解釈すべきだと思います。
    また、コールバックは「自前」で実装しなければなりませんが、この戻り値は明確に定義されていて、
    「列挙を続けるには、戻り値が0以外の値でなければならない。列挙を止めるには、戻り値が0でなければならない。」とあります。

    すなわち、
    「1(!=0)が戻った」なら、「列挙すべきフォントが尽きたので全て列挙した」
    「0が戻った」なら、コールバック関数が何らかの理由により列挙の中断を要請した。

    と見るべきだと思います。
    2022年3月9日 7:52

すべての返信

  • 手元の環境でためしてみたら1が戻ってきました。まあもっとも、あるひ突然0xdeadbeefとか戻ってくるかもしれませんので、あまり意味がある数値として取り扱えるとも思えませんけど


    jzkey

    2022年3月8日 12:58
  • ご返事ありがとうございます。

    私のほうでも「1」が戻ってくることは確認していたのですが、
    正式な仕様の記述があればと思い質問させていただきました。
    ほとんどが「コールバック関数の最後の戻り値」としか記述されていなかったので。。。

    実装しているコールバック関数の戻り値は、「0」固定なのですが、
    その下の分岐で、if(ret !=0){・・・}という分岐を実装しているのですが、
    この条件分岐を実装していいのかが判断できずにいます。

    2022年3月9日 2:14
  • ドキュメントには特に記載がないので、何が返ってくるかを前提としたコードは好ましくないでしょう。

    コールバックに渡すLPARAMを利用するなどして、呼ばれたかどうかの管理を自前でするのがいいかと思います。

    2022年3月9日 2:34
  • WindowsAPIマニュアル通りに解釈すれば、「コールバックが最後に戻した値」なので、
    「一度もコールバックが呼ばれない」ということは「あり得ない」と解釈すべきだと思います。
    また、コールバックは「自前」で実装しなければなりませんが、この戻り値は明確に定義されていて、
    「列挙を続けるには、戻り値が0以外の値でなければならない。列挙を止めるには、戻り値が0でなければならない。」とあります。

    すなわち、
    「1(!=0)が戻った」なら、「列挙すべきフォントが尽きたので全て列挙した」
    「0が戻った」なら、コールバック関数が何らかの理由により列挙の中断を要請した。

    と見るべきだと思います。
    2022年3月9日 7:52
  • TAKAKUNさん、こんにちは。フォーラムオペレーターのKumoです。
    MSDNフォーラムにご投稿くださいましてありがとうございます。

    ご質問いただいた件ですが、その後いかがでしょうか。
    皆様から寄せられた投稿はお役に立ちましたか。

    参考になった投稿には [回答としてマーク] をお願い致します。

    設定いただくことで、
    他のユーザーもお役に立つ回答を見つけやすくなります。

    お手数ですが、ご協力の程どうかよろしくお願いいたします。

    MSDN/ TechNet Community Support Kumo ~参考になった投稿には「回答としてマーク」をご設定ください。なかった場合は「回答としてマークされていない」も設定できます。同じ問題で後から参照した方が、情報を見つけやすくなりますので、 ご協力くださいますようお願いいたします。また、MSDNサポートに賛辞や苦情がある場合は、MSDNFSF@microsoft.comまでお気軽にお問い合わせください。~

    2022年3月11日 6:32
    モデレータ