Microsoft Layer for Unicode

Microsoft Layer for Unicode (MSLU)は、Windows 9x系 (95/98/Me)でUnicode対応のアプリケーションソフトウェアを実行するためのマイクロソフト製のライブラリである。UnicoWS (Unicode for Windows 95/98/Me Systems)やUNICOWS.DLLなどといった名称でも知られている。

マイクロソフトは、MSLUのことを「Windows 95/98/ME上のWin32 APIのレイヤーであり、Unicodeを用いたプログラムだけを書いても全てのプラットフォーム上で動作させることができる」と記述している。 MSLUが登場する前は9x系のWindowsに対応しつつ、Unicode対応にもするには、Unicodeを使ったものとそうでないもの（Windows 9x用）の2つをビルドする必要があった。

MSLUは2001年3月に発表され、同年7月の版のMicrosoft Platform SDKから収録され利用可能となったが、この頃は既にWindows 9x系の絶頂期を過ぎた後であった。

動作 
Windows APIでは、普通A （ANSI: ANSIコードページに基づくマルチバイト文字）版とW （ワイド文字）版の2つの関数が用意されている。Windows 9x系では、A版のみが実装され、W版を呼び出そうとすると、極一部を除いて実装されていない旨のエラーになる。一方Windows NT系では、A版とW版の両方が実装されている（ただし内部で直接実装されているのはW版であり、A版はW版の呼び出しへ変換するサンクとなっている）。

リンクの際、KERNEL32.LIBやADVAPI32.LIBなどWindows APIのライブラリよりも先にUNICOWS.LIBを指定すると、リンカはUNICOWS.LIBからシンボルを解決するようになる。

そして実行時、最初にワイド文字版の関数が呼ばれたとき、UNICOWS.LIB内へ実行が移る。このとき9x系のWindowsで実行していれば、UNICOWS.DLLを読み込みDLL内のサンクスタブへ実行を移す。このサンクスタブはワイド文字引数をANSI文字列へ変換してネイティブなA版APIを呼び出す役割を果たす。逆にW版APIを持つNT系のWindows上で実行していた場合、メモリ上に存在するインポートテーブルを書き換え、以後余分な負荷をかけずにW版の関数を呼び出せるようにする。

このようにするわけは、MSLUをリンクしたアプリケーションソフトウェアが、9x系のWindowsで実行したときのみUNICOWS.DLLを必要となるようにするためである。また、NT系で実行したときに、余分な手間がかかる機会を最初の1回の関数呼出のときだけに留める効果もある。

外部リンク 
断りの無いものは全て英語である。

日本語 
 UNICODEプログラムの作り方 — （日本語）

英語 
 Official announcement of availability.
 MSDN Magazine article describing MSLU
 MSDN programming reference pages
 Michael Kaplan's blog entries about MSLU internals
 Download of MSLU redistributable (UNICOWS.DLL)
 Usenet discussion group: microsoft.public.platformsdk.mslayerforunicode
 Known bugs in each released MSLU version — マイクロソフト内のMSLUの主要開発者が管理している。

オープンソースの代替品 
 libunicows — UNICOWS.LIBの代替のみ。MIT Licenseでライセンスされている。実行時にマイクロソフトのUNICOWS.DLLか次のOPENCOW.DLLが必要。
 Opencow: Open Layer for Unicode — DLLとLIBの実装。旧名MZLU。MPL 1.1/GPL 2.0/LGPL 2.1でライセンスされている。元々はMozillaプロジェクトの一環としてであった。

マイクロソフトのAPI
まいくろそふとれいやあ