【バグ】WideCharToMultiByte の動作がOSごとに違う!その2
WideCharToMultiByte の動作がOSごとに違う の追試を行いました。
そして、細かい仕様が明らかに…。
まず、こちらがソースコード、今回はNTDLL.DLLの RtlUnicodeToMultiByteSize も使用してみました。
#include "stdafx.h" #include "windows.h" #include <stdio.h> int APIENTRY _tWinMain(HINSTANCE hInstance, wsprintfA(str,"OS: %d.%d(Build:%d)\r\n" cp = 50221; |
まず、結果から。
Windows 2000
Windows XP
Vista
見てのとおり、NULLを入れて、バッファサイズを調べたときの返り値と、実際値を入れたときのサイズに乖離があることが分かります。
でも、XPもVistaも RtlUnicodeToMultiByteSize については、Windows2000と同じ結果を返しています。
サンプルプログラムはこちら
あと、Vistaとの違いですが、NULLまで含んだ文字列の場合は同じ動作をするのですが、含まない場合、Vistaでは、全角文字のエスケースが行われるのに対して、2000/XPでは行われないということがわかりました。
問題としては、終端が無いので、次に半角文字が来た場合結合文字列が化ける可能性がある ということです。
つまり、修正を入れるならば、
・十分なバッファを確保して、実際に変換を行う。
・変換後の文字列のサイズを取得。
・バッファの解放。
・値を返す。
そんなわけでkdw 0.78jでパッチを当てた、kernel32.dllを作ってみた。
パッチ後の結果。完璧!
エンコに失敗するという ALM2Thunderbird 1.0
kernel32.dllラッパーを入れたバージョンでは問題なし!
関連記事:
WideCharToMultiByte の動作がOSごとに違う その1
関連サイト:
Windows XPでWideCharToMultiByte関数を使い、ISO-2022-JPに変換するときの注意点 | 山本隆の開発日誌
komatの古往今来: ALM2Thunderbird 1.0の動作OSについて
Comments