NetBSD、FreeBSDでWin32アプリケーションを動かすためのプログラム群PEACEの一部をCygwin/XFreeで動作するようにしてみました。
はじめてX Window Systemを触ったとき、Xのアプリケーションが実行するコンピュータと表示するコンピュータを別にすることが出来ることを知って、すごいなと思ったものです。Windowsでもいまでは、Terminal Serviceやリモートデスクトップなどがありますが、デスクトップ全体が表示されてしまうのでXのアプリケーションのようにアプリケーション単位ということが出来ません。また、表示するコンピュータもWindowsに限られます。
そこで、PEACEがGDI.DLLやUSER32.DLL等のGUIの機能をXlibを使用して実現しているのに目をつけ、このPEACEをWindows(Cygwin/XFree)に移植すればWindowsでもWindowsのアプリケーションをXのアプリケーションのようなネットワーク透過にできると思い、移植してみることにしました。
基本的にUSER32.DLL、GDI32.DLLの実 実装であるui.soを移植しています。やったのは...
これで、一応makeが通るようになりました。>
あと、プログラムがCreateWindowEx等のWin32APIを呼ぶ代わりにPEACEのCreateWindowEx等を呼ばせるようにするために Microsoft ResearchのDetoursというプログラムを利用するようにしました。
私が試した中では、マインスイーパーぐらいしか動きません。
あと、Cygwin版のXFreeがXShmをサポートしていないせいか遅いです。
$ tar zxvf cygpeace-030316.tar.gz $ cd peace/dll/cygpeace $ make $ make install
$ ./detours.exe ([unzip to folder:] ./detours) $ cd detours $ rm lib/detours.pdb $ nmake $ cp samples/bin/withdll.exe /usr/local/bin/
$ export PEACE_FONTPATH=`cygpath -u $WINDIR/Fonts` $ export DISPLAY=:0.0 $ XWin -rootless & $ openbox & $ withdll -d:peacehook.dll winmine
$ cat msgbox.c
#include <windows.h>
int main()
{
MessageBox(NULL, "test", NULL, MB_OK);
return 0;
}
$ gcc msgbox.c -o msgbox -L/usr/local/lib -lui.so
$ export DISPLAY=:0.0
$ ./msgbox