none
Message Compiler の 「error: value too large」 を回避する方法はありますか? RRS feed

  • 質問

  • mc.exeでmcファイルをコンパイルしようとしたとき、次のようなエラーが出てしまいます。

    MC: Compiling Message.mc
    Message.mc(568) : error : Message Id value (40002397) too large

    確かに4000文字を超えていて、多いなとは思うんですが、これを回避する方法はありますか?

    また、試しにこのメッセージを「abcdef」などに変えても同じようなメッセージが出てしまいます。

    遠慮なく回答していただけるとうれしいです!

    • 編集済み onein528 2021年2月14日 1:44
    2021年2月13日 9:32

回答

  • Message Text FilesにMessageIdフィールドの説明がありました。

    Any value specified must fit in 16 bits.For more details on how the message value is formed from the severity, facility, and message ID, see the diagram in Winerror.h.

    そして、Winerror.hの先頭には次のコメントがあります。

    //
    // Note: There is a slightly modified layout for HRESULT values below,
    //        after the heading "COM Error Codes".
    //
    // Search for "**** Available SYSTEM error codes ****" to find where to
    // insert new error codes
    //
    //  Values are 32 bit values laid out as follows:
    //
    //   3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
    //   1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
    //  +---+-+-+-----------------------+-------------------------------+
    //  |Sev|C|R|     Facility          |               Code            |
    //  +---+-+-+-----------------------+-------------------------------+
    //
    //  where
    //
    //      Sev - is the severity code
    //
    //          00 - Success
    //          01 - Informational
    //          10 - Warning
    //          11 - Error
    //
    //      C - is the Customer code flag
    //
    //      R - is a reserved bit
    //
    //      Facility - is the facility code
    //
    //      Code - is the facility's status code
    //

    ですので0x40002397を定義したいのであれば

    MessageId=0x2397
    Severity=Warning

    とする必要があったのかもしれません。

    • 回答としてマーク onein528 2021年2月14日 6:26
    2021年2月14日 6:19

すべての返信

  • 文字数ではなく、MC ファイルの 568 行目に定義している ID の数値が大きすぎるという話でしょう。
    0 から 65535(0xFFFF)の範囲という話を見かけました。

    Why am I being told that my message ID is too large?
    https://devblogs.microsoft.com/oldnewthing/20160513-00/?p=93455

    Message Compiler の仕様やエラーメッセージの読み方・理解の領域なので、依存関係の調べ方・Windows プログラムの動作とはまた違う理解力・経験・スキルが必要な領域ですね。
    (誰であっても、特定の領域で理解・経験が深くても、別の領域では素人となるので、得意/不得意な領域の話は書かなくとも良いと思いますよ)

    また、Windows の使用許諾としては、リバースエンジニアリング・逆コンパイル・逆アセンブルが禁止されているので、ResourceHacker で読み込んで文字列を吸い出してほかのことに使うのは、たぶんダメだと思う。

    2021年2月13日 12:25
    モデレータ
  • フェアユースでいいかなと思ってました。利用規約2.c.(vi)で禁止されていました。申し訳ございません。

    Message Compiler の仕様やエラーメッセージの読み方・理解の領域なので、依存関係の調べ方・Windows プログラムの動作とはまた違う理解力・経験・スキルが必要な領域ですね。
    (誰であっても、特定の領域で理解・経験が深くても、別の領域では素人となるので、得意/不得意な領域の話は書かなくとも良いと思いますよ)

    いや、遠慮なく回答してほしいと思っただけです。ずっと前から悩んでいることでしたし、僕のほうが理解力がなかったようですね...すみませんでした。

    あと、上記URLありがとうございます。

    Message Id valueはメッセージIDの値と理解していたものでしたから、IDのサイズがDWORDに収まっていなかったのに気づきませんでした...

    回答ありがとうございました!!めっちゃ参考になります!

    ---追記---

    この制約を開放する方法はありますか?

    MessageIdTypeDef=DWORDからLONGLONGにしてもだめだったのです(そらそうだと思いますが)。

    ----------

    • 編集済み onein528 2021年2月14日 1:54
    2021年2月14日 1:43
  • 制限は65535とのことですから16bit WORDサイズのようです。たとえばFormatMessageに渡して処理されるわけですから、Windowsの仕様として上限が決められていて、何か定義することによって解消できるものではありません。
    2021年2月14日 3:03
  • 用途不明ですが、Message Compiler 使わなければ良いだけでは?

    これを使わないといけない理由があるなら、それを使う API の仕様の制限を受けるので、任意の ID にしたい理由がないはずです。
    (HRESULT の上位 16 bit は仕様が決まっているので勝手に数値を振ったらダメですので)

    別の目的で、ソース生成ツールとして使っているだけなら、Message Compiler の利用をやめた方が良いでしょうね。
    その方が自由度も保守性も良いと思います。
    (望むような良いツールがあるかは不明なので、最終的にはソース生成ツールを自作することになるかもしれませんが)

    2021年2月14日 3:14
    モデレータ
  • ではDWORD値を超えているcmd.exe.muiはどのようにMessageTableをコンパイルリンクしているのですか?

    SetLastErrorはマイナスもあるし、DWORDの最大値なんでゆうに超えています。

    どうして?ですか?

    2021年2月14日 4:26
  • MUIを作っています。

    cmd.exe.muiは240のMessageTableがあり、上記のIDでした。

    DWORD超えてるからダメというならSetLastErrorの値は何なんでしょう。

    マイナス値もあるし0xFFFFなんてゆうに超えています。

    2021年2月14日 4:56
  • MUIを作っています。

    SetLastErrorは何なんでしょう。マイナス値やFFFFなんてゆうに超えています。

    HRESULTなのに、どのビットを使っているのでしょうか。

    2021年2月14日 5:01
  • ちゃんと読んでいますか?

    • 佐祐理さんが DWORD ではなく、WORD と書いていますが、なぜまだ DWORD と言われているのか
    • HRESULT の上位 16bit には意味があると言っています。そして、前述のサイト に記載があります。

    最上位ビットが 1 ならどういう意味かが書いてあります。
    そして、最上位ビットが 1 ならマイナスとなるでしょう。

    HRESULT をよくわかっていない状態で、Message Compiler をいろいろと触る現状がよくわからないです。
    mui 作る…と書いてあるとはいえ、他者の mui を勝手に作っているの…?
    (その場合、翻案権の問題が出てくるけど)

    あと、mui はリソースであって、Message Compiler で作っていると限らないので、ID が範囲外もあるでしょうね。
    • 編集済み AzuleanMVP, Moderator 2021年2月14日 5:06
    • 回答としてマーク onein528 2021年2月14日 5:57
    • 回答としてマークされていない onein528 2021年2月14日 6:26
    2021年2月14日 5:02
    モデレータ
  • そうですか。すみません。

    HRESULTはビットごとに値が入っていることはしっています。mc.exeを使わずにシステムのメッセージテキストを作っているという考えが浮かぶのか聞きたかっただけです。

    権利権利っていんですもう、まだつくってないし、知ることは違法じゃないはず。

    っていうか、確かにmuiはいろんなリソースを含めれますが、muiのリソースの中にMessageTableがあるんです。mcファイルをmc.exeでコンパイルしなくてどのようにコンパイルするのですか。めっちゃビルド複雑なんですよ。muiつくるのにmcもrcもlinkもmuirctも必要。

    • 編集済み onein528 2021年2月14日 6:03
    2021年2月14日 5:57
  • Message Text FilesにMessageIdフィールドの説明がありました。

    Any value specified must fit in 16 bits.For more details on how the message value is formed from the severity, facility, and message ID, see the diagram in Winerror.h.

    そして、Winerror.hの先頭には次のコメントがあります。

    //
    // Note: There is a slightly modified layout for HRESULT values below,
    //        after the heading "COM Error Codes".
    //
    // Search for "**** Available SYSTEM error codes ****" to find where to
    // insert new error codes
    //
    //  Values are 32 bit values laid out as follows:
    //
    //   3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
    //   1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
    //  +---+-+-+-----------------------+-------------------------------+
    //  |Sev|C|R|     Facility          |               Code            |
    //  +---+-+-+-----------------------+-------------------------------+
    //
    //  where
    //
    //      Sev - is the severity code
    //
    //          00 - Success
    //          01 - Informational
    //          10 - Warning
    //          11 - Error
    //
    //      C - is the Customer code flag
    //
    //      R - is a reserved bit
    //
    //      Facility - is the facility code
    //
    //      Code - is the facility's status code
    //

    ですので0x40002397を定義したいのであれば

    MessageId=0x2397
    Severity=Warning

    とする必要があったのかもしれません。

    • 回答としてマーク onein528 2021年2月14日 6:26
    2021年2月14日 6:19
  • あ!!!!そういうことか!!!!!理解しました!

    ID番号はいろんな情報を含んでいること、それはServerityやFacilityを設定することにより変わる。

    これが最終回答ですか。。。。

    いや、ほんとうにありがとうございます。

    おかげで理解しました。またHRESULTについてもMSDocsのその関連の情報をすべて見ようと思います。

    2021年2月14日 6:29
  • あと、これ見てください。ほんものかどうかしらないけど、mc.exe使ってるって。 https://github.com/Microsoft-Leaked-shit/windows_nt_4_source_code/blob/master/windows_nt_4_source_code/nt4/private/windows/
    • 編集済み onein528 2021年2月14日 7:49
    2021年2月14日 7:49