(2010年6月20日更新)
W2LライブラリはVideo maidでWindowsのCodec(DLL)を実行するためのW32Loaderを応用したライブラリです。W32LoaderはWindowsのPE形式の実行可能ファイルをIA-32のUNIX系OS上で実行します。
W32Loaderを発展させたW2LライブラリではC/C++言語で書かれたWindowsのAPIを使用するプログラムのソースコードをUNIX系OS上でコンパイルしてOSネイティブな実行可能ファイルを作成することができます。CPUはIA-32に限定されません。GTK+が動作する環境ならば、どのような環境でもソースコードから実行可能ファイルを作ることができます。
W2Lライブラリを利用すれば、Windowsプログラムを簡単にUNIX系OSに移植できます。
GTK+版はGTK+-2.0以降
GTK+版はUbuntu 10.04 LTS
文書で説明するよりも、実物を見た方がわかりやすいと思います。15puzzle-0.0.2.tar.gzに含まれるsrc/15puzzle.c、src/15puzzle.rc、src/resource.hはWindowsのプログラムのソースコードです。15puzzle.cはC言語、15puzzle.rcはリソーススクリプトです。WindowsのAPIだけを使っており、純粋なWindowsプログラムです。これはVisual C++で
> tar zxvf 15puzzle-0.0.2.tar.gz > cd 15puzzle-0.0.2 > nmake /f Makefile.msc
とすることでコンパイルできます。Visual C++でコンパイルした実行可能ファイルは15puzzle-0.0.2-win32.zipです。
このWindowsのプログラムのソースコードを書き変えることなく、W2Lライブラリと組み合わせてUNIX系OSのネイティブな実行可能ファイルを作ることができます。以下の一般的なUNIX系OSのビルド手順で作成できます。
$ tar zxvf 15puzzle-0.0.2.tar.gz $ cd 15puzzle-0.0.2 $ ./configure $ make
リソーススクリプトの処理にはGNU Binutilsに含まれるwindresが必要です。windresは標準では作成されません。windresが用意できない場合にはコンパイル済みの15puzzle.resをDownloadして下さい。
DLL | 実装API数 | 全API数 | 実装率 |
---|---|---|---|
advapi32.dll | 45 | 566 | 7% |
comctl32.dll | 50 | 82 | 60% |
comdlg32.dll | 6 | 26 | 23% |
gdi32.dll | 25 | 545 | 4% |
kernel32.dll | 272 | 829 | 32% |
msvcrt.dll | 128 | 731 | 17% |
ole32.dll | 7 | 305 | 2% |
oleaut32.dll | 0 | 360 | 0% |
rasapi32.dll | 0 | 146 | 0% |
rasdlg.dll | 0 | 33 | 0% |
shell32.dll | 23 | 175 | 13% |
user32.dll | 196 | 695 | 28% |
version.dll | 6 | 14 | 42% |
winmm.dll | 10 | 199 | 5% |
wsock32.dll | 38 | 75 | 50% |
Windows専用のプログラムをマルチプラットフォーム化してUNIX系OSにも対応させようと考えたとき、いくつか方法があると思いますがどの場合でもソースコードを書き直したり新規にソースコードを書く必要があります。またツールキットに対する知識やUNIX系OSに関する知識を新たに習得する必要があります。Windowsネイティブなプログラムを止めてツールキットなどでマルチプラットフォーム化した場合、新しくなったGUIや機能が既存のユーザに受け入れられるとは限りません。また書き直したプログラムが思うように動作するとも限りません。Windowsネイティブなプログラムの開発を続けつつ、UNIX系OSに移植した場合には同時に2系統のプログラムのサポートをしなければなりません。これにはコストがかかります。Windowsプログラムをマルチプラットフォーム化することは、リスクやコストがかかります。デスクトップ分野でのWindows以外のOSの普及率を考えるとリスクやコストを負ってまでWindows以外のOSに対応するメリットはありません。
しかしW2Lライブラリを利用すれば、今あるWindowsプログラムのソースコードをそのまま使ってUNIX系OSのネイティブな実行可能ファイルを作ることができます。すでに書いたソースコードを書き直す必要がありません。Windowsプログラムはそのままなので、既存のWindowsユーザが不満を持つことはないでしょう。マルチプラットフォーム化を止める場合でも、W2Lライブラリを捨てるだけで元の状況に戻るので止めることも容易です。
今現在、C/C++言語で書かれたWindowsのAPIを使用するプログラムを開発しているならば、そのままW2Lライブラリでマルチプラットフォーム化できます。
Windowsでの実行を前提としたプログラムを書き変えることなく移植するため、UNIX系OSのプログラムとしては不自然なプログラムになってしまうことは避けられません(GUIのボタンの配置や用語の違いなど)。ドライブのルートやパスの区切りの文字などのファイルシステムの仕様の違いはある程度はW2Lライブラリが吸収しますが、問題が生じる可能性もあります。
W2LライブラリではデバイスドライバやWindows固有の機能に依存するプログラムには対応できないかもしくはUNIX系OSで動作させても無意味です。
本当にまったく書き変えることなくWindowsのプログラムをUNIX系OSでコンパイルできるかと言うと、実はそうとは言えません。Visual C++などのWindowsのコンパイラ固有の機能を利用している場合には、ソースコードの書き変えが必要です。インラインアセンブラや64ビットの整数型などです。IA-32以外のCPUにも対応するならばCPUの仕様に依存するコードも書き変える必要があります。例えばバイトオーダーや変数のビット数の決め打ちなどは危険です。しかしこれらの書き変えは元のWindowsプログラムの価値を損ねるものではありません。むしろプログラムの価値を高めます。これらの書き変えを行えば、64ビットのWindowsプログラムも作ることができるようになります。(IA-32の仕様に依存するコードでは64ビットのWindowsプログラムを作ることはできません。)
新規に開発するならば初めからマルチプラットフォームを前提としたツールキットなどを使うべきです。今現在、C/C++言語で書かれたWindowsのAPIを使用するプログラムを開発していないならば、W2Lライブラリでマルチプラットフォーム化するメリットはありません。
WineをはじめとするWindowsの実行可能ファイルをUNIX系OSで動作させようとするプロジェクトとW2Lライブラリは似てはいますが異なります。WineなどはWindowsの実行可能ファイルを実行するプログラムであり、そのOSネイティブの実行可能ファイルを作るものではありません。またWineはCPUがIA-32である必要があります。それに対してW2LライブラリはOSネイティブな実行可能ファイルを作ります。またCPUはIA-32に限定されません。しかしWineは実行可能ファイルがあれば実行できるのに対してW2Lライブラリはソースコードが必要です。多くの場合、Windowsのプログラムではソースコードは公開されていないためW2Lライブラリでは作者の協力が必要となります。
GTK+、Qt、wxWidgets、WideStudio/MWTなどのマルチプラットフォームのためのツールキットを使えば、共通のソースコードからWindowsやUNIX系OSの実行可能ファイルを作ることができます。しかしそのためには、そのツールキット向けにソースコードを書かなければなりません。今あるWindowsプログラムのソースコードをそのまま使うことはできません。それに対してW2LライブラリはWindowsプログラムのソースコードをそのまま使うことができます。
Kylix 3ではC/C++言語もサポートしています。しかしWindows APIをサポートしているわけではないので、WindowsからUNIX系OSに移植するためにはWindows APIを置き換える必要があります。CLX(Common Library for Cross Platform)だけを利用するプログラムは容易に移植できると思われます。Kylixを取り巻く状況は上記のマルチプラットフォームのためのツールキットの状況に似ています。
これらを利用すればマルチプラットフォームが可能です。しかし今あるWindowsプログラムのソースコードをそのまま使うことはできず、ソースコードを書き直す必要があります。
ReactOSはWindows互換のOSを作るプロジェクトです。マルチプラットフォームとは関係ありません。