登 大遊@筑波大学大学院コンピュータサイエンス専攻の SoftEther VPN 日記 このページをアンテナに追加 RSSフィード

Daiyuu Nobori's SoftEther VPN Diary since 2004

登の Web サイト: http://dnobori.cs.tsukuba.ac.jp/

mixi : http://mixi.jp/show_friend.pl?id=672294
Twitter : http://twitter.com/dnobori/
Facebook: http://www.facebook.com/dnobori

日記などへのリンク集
IKeJI さん | Cedar さん | Mayaqua さん | thisjun さん
bakueikozo さん | mugen さん | 分散計算の神林君 | 榮樂先生 (hdk) | 吉田戦車 (ceekz) | 高木先生 | ron さん
AC の古澤さん | AC の TAKAO 君 | AC の NIES 君 | AC の古橋君 | AC な wakatono さん | AC のいのひろ君
AC な三戸君 | AC な柴田君 | AC の小野君 | AC すぎる松本君 | AC な小西君 | AC な google の及川さん | AC な tomocha さん
まつもとゆきひろ氏 | 板野先生の blog | 新城先生の最近の fj への投稿 | つくばあさひなあんてな | hatena 筑波大学 AC リング

日記でよく出てくる「AC」(もともとは筑波大学用語) について詳しくは ここここ をお読みください。

 | 

2004年12月1日 (水) Unicode 系文字列 API と ANSI 系文字列 API

不吉な予感について  不吉な予感についてを含むブックマーク  不吉な予感についてのブックマークコメント

前回の日記で「不吉な予感について」を書いたあと、北海道で結構強い地震が起こったが、ただの偶然であろう。次回もう一回同じことがあれば、偶然ではないということになるかも知れない。

こらー  こらーを含むブックマーク  こらーのブックマークコメント

SoftEther 2.0 で、ユーザーインターフェイスを多言語に対応させるために、内部の文字列表現を Unicode にして書いていた。これで Windows NT 系で動作させている場合はマルチランゲージ対応完璧である。

Windows は大半の文字列を処理する (指定する) API で、Unicode 版、ANSI 版の 2 つの関数名が用意されている。たとえば SetWindowTextA と SetWindowTextW のように。

開発者が SetWindowText と書くと、UNICODE マクロが定義されていない場合は SetWindowTextA が使用され、定義されている場合は SetWindowTextW が指定されるようになる。

Windows 9x 系にも、これら A (ANSI) 系と W (Unicode) 系の 2 つの API がほぼすべて揃っている (DLL でエクスポートされている)。

これまでの私の理解では、

  • Windows NT 系 (2000、XP など)
  • Windows 9x 系
    • ANSIAPI が本当の実装で、UnicodeAPI はラッパーになっていて文字列を ANSI に変換して ANSIAPI に渡す。

というようになっていた。

しかし、どうやらそうではないということに最近気がついた。

Windows 9x 系の API 関数は、ほぼすべて A 系と W 系がエクスポートされているが、W 系関数を呼び出すと A 系関数に変換されてうまく実行される場合と、何もせずに必ずエラーを返すようになっている場合の 2 種類の API があるらしい。

実は SoftEther 2.0 のインターフェイスを Windows Me 上で動作させるために頑張っていたときのことである。いくつかの UnicodeAPI は Windows Me 上でも正しく動作した (恐らく内部で ANSI 文字列に変換されて動いている) のだが、動かない (常にエラーを返す) ものもあった。

どうやら、API によって動くものと動かないものがあるらしい。

Microsoft の解説では、これまで ANSI 系文字列に対応していた、国際化非対応のプログラムも、Win32 API の慣習に従って正しく書いていると、_UNICODE マクロを定義するだけで自動的に国際化対応版としてコンパイルできる♪ というものがあったと思うのだが、どうもそうではないようだ。_UNICODE マクロを付けると UnicodeAPI が呼び出されるようになり、Windows NT 系で動作させている場合は自動的に Unicode 対応ユーザーインターフェイスプログラムとして動作できるようになるが、Windows Me / 98 上では一部の API が動かなくなるようである。

Platform SDK のドキュメントでは、ほとんどの API について

Unicode:Windows NT/2000 は Unicode 版と ANSI 版を実装

などと統一的書かれているが、Windows 9x 上で呼び出すことができるかどうかは明記されていない。恐らく、呼び出させる保証は無いのだろう。しかし、わかっているのであれば、どの W 系 API が Windows 9x 内では自動的に A 系に変換されて呼び出せるラッパーが実装されていて、どの API が実装されていないか、といった情報リストがあれば助かるのだが…… と思った。

この仕様のため、結局すべての UI 系 API 呼び出しの部分を、NT 上で実行している場合とそうでない場合に分岐させて独自に Unicode / ANSI 文字列変換を行うように書き換えた。結構、苦労した。

自動車  自動車を含むブックマーク  自動車のブックマークコメント

なぜか、夜中に大学の駐車場でマニュアル車 (ぺんこあ) の運転練習をするぞということになった。エンスト2回してやめた。

加藤大先生  加藤大先生を含むブックマーク  加藤大先生のブックマークコメント

加藤大先生が教授に昇進されたらしい。すごー

hshs 2004/12/02 02:32 95系では、ほとんどのAPIがUNICODE対応していないと思ったほうがいいと思います。
95系環境で、UNICODE APIをANSI系にwrapしてくれるものとして、MS Layer for UNICODE というシロモノがあります。(当然ながら、これは、標準ではインストールされていません)

softethersoftether 2004/12/02 23:49 あちゃー

hshs 2004/12/03 08:50 ご参考まで
MSLU (Microsoft Layer for Unicode on Windows 95/98/Me Systems)
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnanchor/html/anch_mslu.asp

95系で標準サポートされている UNICODE 対応API一覧
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/mslu/winprog/other_existing_unicode_support.asp

aregearege 2004/12/05 09:28 _T 系を使えば、ほとんど上手くいくと思うが(−−?

hshs 2004/12/05 17:19 それだと、95系とNT系で、別バイナリになってしまいますな。
文脈をみる範囲では、単一バイナリで両対応したいのだと思いますが。

トラックバック - http://d.hatena.ne.jp/softether/20041201
 | 

<< 2004/12 >>
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31




※ この Web サイトのコンテンツは 登 大遊 が個人的に運営しているものであり、ソフトイーサ株式会社や筑波大学内での立場として公式なコメントを掲載しているものではありません。一応コメントは投稿できるようにしていますが、個人的に運営している日記のため、自分が不快に思ったコメントは前触れ無く削除しております。ご了承ください。同様に会社に関するコメントなどについても、削除される可能性があります。コメント書き込み機能については、匿名の掲示板のような状態になることを予防するため、はてなユーザーからのみ受け付けるように設定することもあります。