メインコンテンツへジャンプする

JPNICはインターネットの円滑な運営を支えるための組織です

ロゴ:JPNIC

WHOIS 検索 サイト内検索 WHOISとは? JPNIC WHOIS Gateway
WHOIS検索 サイト内検索

idn wrapper

概要

idn wrapper は WINSOCK DLL を使用している既存の Windows 用 アプリケーションを、再コンパイルなしに国際化ドメイン名を扱えるように するためのツールです。

ここでは、idn wrapper の仕様について解説します。 使用方法については、 idn wrapper のガイド のほうをご覧ください。

実現方法

idn wrapper が既存のアプリケーションからどのようにして国際化ドメイン名 を使えるようにするのか説明します。

wrapper DLL

wrapper DLL は、idn warpper が提供しているDLL です。 このDLL はアプリケーションと元のWINSOCK DLL との間に割り込み、 アプリケーションからのDLL の呼び出しを横取りして、本来のDLL とは 異なった処理をさせます。

conversion/NAMEPREP by winsock wrapper

アプリケーションからのDLL の呼び出しは、まず wrapper に渡されます。 warpper はそこで、受け取ったドメイン名をエンコード (ローカルエンコーディングからIDN エンコーディングへ変換) してから 元のDLL のエントリを呼び出します。 また、元のDLL の処理結果はいったん wrapper に返されます。 ここで wrapper は先ほどとは逆に、デコード (IDN エンコーディング からローカルエンコーディングへの変換) を行い、結果をアプリケーション に返します。

ただし、非同期API (WSAAsyncGetHostByName など) について は、特別な処理が必要です。 非同期API ではDNS サーバからの応答を受信する前に復帰してしまい、 処理の完了はWindows へのメッセージによって通知されます。 そこで、非同期API が呼び出された場合に idn wrapper は、通知先の ウィンドウプロシジャ (これはAPI のパラメタで指示されます) にフックを 設定します。 フックが完了メッセージ (これもAPI のパラメタで指示されます) を検出 したら、フックは結果の格納領域 (これもAPI のパラメタで指示されています) のドメイン名をデコードします。

idn wrapper では、WINSOCK DLLの バージョン 1.1 (WSOCK32.DLL) および 2.0 (WS2_32.DLL) に対する wrapper DLL を提供しています。 16ビット版のWINSOCK (WINSOCK.DLL) は対象外です。

処理対象のAPI

idn wrapper は WINSOCK の名前解決に関連したAPI に対して、前述のような ドメイン名のエンコードやデコードといった変換処理を付加します。 処理の対象としているWINSOCK API は次の通りです。

API WINSOCK
1.1 2.0
同期 API gethostbyaddr
gethostbyname
getaddrinfo
freeaddrinfo
getnameinfo
WSALookupServiceBeginA
WSALookupServiceNextA
WSALookupServiceEnd
非同期 API WSAAsyncGetHostByAddr
WSAAsyncGetHostByName

WINSOCK 2.0 には、WIDE CHARACTER ベースの名前解決用に次のAPI も ありますが、これらについては置き換えません。

  • WSALookupServiceBeginW
  • WSALookupServiceNextW

これらのAPI はマイクロソフト仕様による国際化に対応したものですから、 そのフレームワーク上で使うべきものです。 これらについては、他の国際化フレームワークに変換してしまうのは危険と 判断しました。

対象以外のAPI については、idn wrapper は何もしないで、元のWINSOCK API を呼び出します。

WINSOCK DLL のコピー

idn wrapper では、元のWINSOCK DLL を名前を変えて idn wrapper のインストールディレクトリにコピーし、それを 呼び出すように作られています。 一方、wrapper DLL は元のWINSOCK DLL と同じ名前で、アプリケーションの 実行形式ファイルと同じディレクトリにコピーされます。 従って idn wrapper がインストールされた状態では、次のようになります。

WSOCK32.DLL
idn wrapper の WINSOCK 1.1 DLL。 アプリケーションの実行形式ファイルと同じディレクトリにコピーされる。
WS2_32.DLL
idn wrapper の WINSOCK 2.0 DLL。 アプリケーションの実行形式ファイルと同じディレクトリにコピーされる。
WSOCK32O.DLL
元の WINSOCK 1.1 DLL である WSOCK32.DLL を改名したもの。 idn wrapper のインストールディレクトリにコピーされる。
WS2_32O.DLL
元の WINSOCK 2.0 DLL である WS2_32.DLL を改名したもの。 idn wrapper のインストールディレクトリにコピーされる。

変換モード

WINSOCK 2.0 に対応しているWindows では、WINSOCK 1.1 と2.0 のそれぞれ に対応するDLL があり、WINSOCK 1.1 のAPI を呼び出すと、WINSOCK 1.1 内部で 2.0 の同名のエントリを呼び出すようになっています。 つまり、1.1 の API を呼び出しても、実質的な処理は 2.0 の DLL 内部で 行われます。

winsock 1.1, 2.0 and application

WINSOCK 2.0 に対応しているWindows のシステムディレクトリ上に idn wrapepr にインストールした場合は、WINSOCK 2.0 の DLL だけを wrapper DLL に置き換えることになります。

ところが、システムディレクトリ以外の場所にインストールした場合 (通常はこちらになります) は、この方法ではうまくいかないことがあります。 WINSOCK 1.1 DLL の中には、システムディレクトリの WINSOCK 2.0 DLL を参照しているものがあり、 この場合システムディレクトリ以外の場所にある WINSOCK 2.0 用の wrapper DLL は呼び出されないからです。 したがって、このような場合には 1.1、2.0 のDLL の両方を wrapper DLL に置き換える必要があります。

さらに、Windows 95 のように WINSOCK 1.1 にしか対応していない OS も あります。

winsock 1.1 and application

この場合には必然的に1.1 用の wrapper DLL でエンコーディングを変換しなければなりません。

このようなDLL 間の呼び出しの関係は Windows のドキュメントに記述 されていませんので、環境、バージョンによっては異なった動作をするかも 知れません。 そこでidn wrapper では、どのバージョンの WINSOCK を置き換えるのかを、 設定ツールで 指定できるようになっています。

レジストリの設定

idn wrapper のレジストリの設定情報は、

HKEY_LOCAL_MACHINE\Software\JPNIC\IDN
HKEY_CURRENT_USER\Software\JPNIC\IDN

の下に格納されます。

idn wrapperは最初に HKEY_LOCAL_MACHINE の設定を読み込み、 HKEY_CURRENT_USER 側にも設定があれば、これで上書きします。 通常は、HKEY_LOCAL_MACHINE 側だけを設定します。 ユーザ毎に異なった設定を使いたい場合のみ、 HKEY_CURRENT_USERを設定するようにしてください。

設定ツールは HKEY_LOCAL_MACHINE の設定だけを読み書き するようになっています。

では、これ以降はそれぞれのレジストリキーについて説明します。 レジストリキーは次のように短く表記しています。

LogFile   (REG_SZ)

これは、実際には次のような意味になります。

HKEY_LOCAL_MACHINE\Software\JPNIC\IDN\LogFile   (REG_SZ)
HKEY_CURRENT_USER\Software\JPNIC\IDN\LogFile   (REG_SZ)

また、レジストリキーの一部については、idn wrapper を適用する アプリケーション毎に個別の値を設定するものもあります。 その場合は、次のように記しています。

PerProg\[アプリケーション名]\Encoding   (REG_SZ)

[アプリケーション名] の部分には、アプリケーションの実行モジュール名 を指定します。 たとえば、Internet Explorer は実行モジュール名が IEXPLORE なので、実際のレジストリキーは次のようになります。

HKEY_LOCAL_MACHINE\SOFTWARE\JPNIC\IDN\PerProg\IEXPLORE\Encoding
HKEY_CURRENT_USER\SOFTWARE\JPNIC\IDN\PerProg\IEXPLORE\Encoding

インストールディレクトリ

InstallDir   (REG_SZ)

idn wrapper のインストールディレクトリのパス名です。 インストール時に、インストーラによって自動的に設定されます。 このレジストリ情報に関しては、他のものと異なり HKEY_CURRENT_USER の設定は参照されません。 idn wrapper のインストーラはこのディレクトリに元のWINSOCK DLL のコピーを作成します。 idn wrapper のwrapper DLL は実行時にこの DLL を参照します。

設定ファイル名

ConfFile   (REG_SZ)

idn wrapper が国際化ドメイン名の変換処理に使用している idnkit の コンフィギュレーションファイルの名前です。

このファイルには、国際化ドメイン名の処理に必要な各種のパラメータ を設定します。 詳しくは idnkit の設定 をご覧 ください。 この値は、設定ツールで変更することができます。 idn wrapper のインストーラが設定する初期値は、インストールディレクトリ の下の idn.conf というファイルになっています。

ログファイル名

LogFile   (REG_SZ)

idn wrapper のログファイルの名前です。 この値は設定ツールで変更することができます。 idn wrapper のインストーラが設定する初期値は、インストールディレクトリ の下の idn_wrapper.log というファイルになっています。

ログレベル

LogLevel   (DWORD)

ログレベルの指定です。 この値も設定ツールで変更することができます。 値と意味は次の通りです。

-1 (None)
ログを出力しない
0 Fatal
致命的エラーのみ記録する
1 (Error)
致命的でないエラーも記録する
2 (Warning)
警告メッセージも記録する
3 (Info)
その他の情報も記録する
4 (Trace)
トレース出力も記録する

これらは、idnkit ライブラリのログレベルに対応しています。 idn wrapper は idnkit ライブラリ (IDNKIT.DLL) を使用 していますが、idnkit ライブラリから出力されるログは、このログレベル の設定に応じて記録されるかどうかが決まります。 また、idn wrapper 自身が出力するログについては、-1 以外を指定すると 記録されるようになります。

idn wrapper のインストーラが設定する初期値は -1 (ログを出力しない) です。

変換モード

Where   (DWORD)

変換モードについて、有効な値は次の4 つです。

0
WINSOCK 1.1、2.0 の両方で変換。
1
WINSOCK 2.0 があれば、2.0 だけで変換。なければ 1.1 だけで変換。
2
WINSOCK 1.1 だけで変換。
3
WINSOCK 2.0 だけで変換。

最適な値は OS や WINSOCK DLL のバージョンによって異なります。 idn wrapper がうまく動作しない場合、この設定を変えると動作するように なることがあります。 idn wrapper のインストーラがセットする初期値は、Windows 95, 98, Me, NT では 0、 Windows 2000, XP では 1 です。 この値も設定ツールで変更することができます。

ローカルエンコーディング

PerProg\[アプリケーション名]\Encoding   (REG_SZ)

ローカルエンコーディングは、通常は実行中のアプリケーションに対して セットされたコードページから決定されます。 wrapper DLL が使用する iconv ライブラリは、Windows のコードページ名 (例: "CP932") をエンコーディング名として受け付けることが できるので、コードページ名をそのままローカルエンコーディング名として 使用します。

しかし、アプリケーションによっては、特定のエンコーディングを使用して いるものもあります。 たとえば、IEではドメイン名を UTF-8 で表記するように指示することが できるようになっています。

このような状況に対処するため、idn wrapper は、ローカルエンコーディング としてアプリケーション特有のエンコーディングも受付けることができる ようになっています。 このような、アプリケーション特有のローカルエンコーディングはレジストリ に記しておきます。 ただし、ローカルエンコーディング名は idnkit ライブラリが認識するもので なければなりません。

idn wrapper のインストーラはこのレジストリキーの設定を行いません。 この値も設定ツールで変更することができます。

ソフトウェア毎の変換モード

PerProg\[アプリケーション名]\Where   (DWORD)

レジストリキー Where と働きは同じですが、こちらは特定のアプリケーションに対して別の値を 指定したいときに用います。 Where の設定よりも優先されます。

idn wrapper のインストーラはこのレジストリキーの設定を行いません。

このページを評価してください

このWebページは役に立ちましたか?
ページの改良点等がございましたら自由にご記入ください。

このフォームをご利用した場合、ご連絡先の記入がないと、 回答を差し上げられません。 回答が必要な場合は、お問い合わせ先をご利用ください。

ロゴ:JPNIC

Copyright© 1996-2019 Japan Network Information Center. All Rights Reserved.