トップ回答者
MSDNのヘルプ(EventLog.WriteEntry)について

質問
-
MSDNの日本語サイトのEventLog.WriteEntryのページ
(http://msdn.microsoft.com/ja-jp/library/xzwc042w(v=vs.80).aspx)には、
例外セクションに「メッセージ文字列が32766バイトを超えています。」と書かれていますが、
これはバイト数ではなく文字数の誤りでしょうか?
こちらで確認した所、32766文字(65532バイト)を超えた場合にArgumentExceptionが発生します。
なお、Win32APIのReportEvent関数の英語サイト
(http://msdn.microsoft.com/en-us/library/windows/desktop/aa363679(v=vs.85).aspx)には、
bytesではなくcharactersと書かれています。以下のように書かれており、
--------------------
A pointer to a buffer containing an array of null-terminated strings that are merged into the message before Event Viewer displays the string to the user. This parameter must be a valid pointer (or NULL), even if wNumStrings is zero. Each string is limited to 31,839 characters.
--------------------
以上、よろしくお願いします。
回答
-
mickey0607 さん
Win7 (32bit), VS2010の環境で、例外のメッセージを出力すると、以下のように表示されました。
32,766文字と表示されていますし、MSDNの誤りのようなです。
英語では、1文字=1byte (文字コードによりますが・・)ですので、日本語にそのまま自動翻訳した結果でしょうか?
また、引用されている英文では31,839 となっていますが、.NET Framework のバージョンによって異なるようです。
.NET Framework 4.5 の場合 http://msdn.microsoft.com/ja-jp/library/vstudio/xzwc042w(v=vs.110).aspx
- 編集済み kentahoga 2013年4月19日 2:45
- 回答としてマーク mickey0607 2013年4月19日 10:13
-
kentaro_さん
ありがとうございます。
仰る通り、私も自動翻訳した結果かなと思っています。
ただ、英語圏でも.NETのstring型はUnicode(UTF16)で1文字=2byteだと思いますので、
英語サイトの方も間違っているのかなと思っています。
なお、私の環境で動作検証した結果、OSによって文字列の長さが異なりました。
.NET
OS
bit
バイト上限(ソース名+メッセージ)
バイト上限(メッセージのみ)
2.0
XP
32bit
65532バイト
3.5
XP
32bit
65532バイト
4.5
XP
32bit
65532バイト
2.0
Vista
32bit
63786バイト
3.5
Vista
32bit
63786バイト
4.5
Vista
32bit
63786バイト
2.0
Win7
32bit
63824バイト
3.5
Win7
32bit
63824バイト
4.5
Win7
32bit
63824バイト
2.0
Win7
64bit
63788バイト
3.5
Win7
64bit
63788バイト
4.5
Win7
64bit
63788バイト
2.0
Win8
32bit
63824バイト
3.5
Win8
32bit
63824バイト
4.5
Win8
32bit
63824バイト
2.0
Win8
64bit
63780バイト
3.5
Win8
64bit
63780バイト
4.5
Win8
64bit
63780バイト
XP以外は、32766文字入力できず、上限もバラバラでした。
上記表のバイト数~65532バイト(32766文字)の間の文字数で書き込みを行った場合
別のエラーメッセージが表示されました。(また、たまにイベントログが壊れることもありました。)
以上の事から、MSDNの32766バイトを単純に文字数と考えても上手くいかなそうです。
kentaro_さんアドバイス頂きありがとうございました。
- 回答としてマーク mickey0607 2013年4月19日 10:13
すべての返信
-
mickey0607 さん
Win7 (32bit), VS2010の環境で、例外のメッセージを出力すると、以下のように表示されました。
32,766文字と表示されていますし、MSDNの誤りのようなです。
英語では、1文字=1byte (文字コードによりますが・・)ですので、日本語にそのまま自動翻訳した結果でしょうか?
また、引用されている英文では31,839 となっていますが、.NET Framework のバージョンによって異なるようです。
.NET Framework 4.5 の場合 http://msdn.microsoft.com/ja-jp/library/vstudio/xzwc042w(v=vs.110).aspx
- 編集済み kentahoga 2013年4月19日 2:45
- 回答としてマーク mickey0607 2013年4月19日 10:13
-
kentaro_さん
ありがとうございます。
仰る通り、私も自動翻訳した結果かなと思っています。
ただ、英語圏でも.NETのstring型はUnicode(UTF16)で1文字=2byteだと思いますので、
英語サイトの方も間違っているのかなと思っています。
なお、私の環境で動作検証した結果、OSによって文字列の長さが異なりました。
.NET
OS
bit
バイト上限(ソース名+メッセージ)
バイト上限(メッセージのみ)
2.0
XP
32bit
65532バイト
3.5
XP
32bit
65532バイト
4.5
XP
32bit
65532バイト
2.0
Vista
32bit
63786バイト
3.5
Vista
32bit
63786バイト
4.5
Vista
32bit
63786バイト
2.0
Win7
32bit
63824バイト
3.5
Win7
32bit
63824バイト
4.5
Win7
32bit
63824バイト
2.0
Win7
64bit
63788バイト
3.5
Win7
64bit
63788バイト
4.5
Win7
64bit
63788バイト
2.0
Win8
32bit
63824バイト
3.5
Win8
32bit
63824バイト
4.5
Win8
32bit
63824バイト
2.0
Win8
64bit
63780バイト
3.5
Win8
64bit
63780バイト
4.5
Win8
64bit
63780バイト
XP以外は、32766文字入力できず、上限もバラバラでした。
上記表のバイト数~65532バイト(32766文字)の間の文字数で書き込みを行った場合
別のエラーメッセージが表示されました。(また、たまにイベントログが壊れることもありました。)
以上の事から、MSDNの32766バイトを単純に文字数と考えても上手くいかなそうです。
kentaro_さんアドバイス頂きありがとうございました。
- 回答としてマーク mickey0607 2013年4月19日 10:13