Windows NT/95系のThunkのような仕組みはx64版Windowsでも用意される?

 MSのサポート技術情報にx64版Windows XPのサポート技術情報がでてきました。[IME2002] Windows XP x64 で Microsoft IME を使用する際の注意点。同じような問題はWindows NT3.51時代にもあり、16bitのIMEをNT3.51で動かすと~というような問題があったと記憶しています。Windows NTのIMEはNT3.51位からちゃんと動き出したような印象があります。

 x64 Windows ではx64バイナリとx32バイナリで相互に呼び出しをすることができないのでしょうか?最近セキュリティ関係でうるさいので、異なるフォーマットのバイナリの相互乗り入れはやめた方がいいのかもしれません。.NETというか、C#,C++のマネージ拡張,VB.NET等が出力するMSILは非依存なので、JITによって64bitのネイティブで動くようですね。もちろん、マネージドコードのみの場合のお話ですが。

さて、今はいざ知らず、16bitバイナリが動作していたWindows 3.1からWindows 95への移行はたいへんなものでした。Windows 95になってさえも、16bitのアプリケーションが結構はびこっていたと記憶しています。Windows NTではお行儀のいいWin 16アプリケーション以外は切り捨てると言うことが比較的許されましたが、Windows 95ではそんなことをしたら売れなくなります。

 必然的に16bitと32bit版のバイナリの混在は必然でした。また、Windows 95そのものにも結構16bit版のバイナリになっているところがあったようです。では、32bitから16bitのDLLを呼び出したり、またその逆をしたい場合どうしたか?Windows にはThunk(サンク)と呼ばれる仕掛けが用意されており、これをつかって両者の橋渡しをすることができました。Windows NTおよび、95系のすべてのWindowsで実装されているのがGeneric Thunk。これは16bitアプリケーションから32bit DLLを呼び出すために使います。

 そして、Windows 95/98/Meにのみ実装されているのが、Flat Thunk。こちらでは32bitから16bitのコードを呼び出すことができました。移行のためにはGeneric Thunkが推奨されていましたが、DLL内でスレッドを作ってはいけない(Windowsのファイルオープンダイアログなどはスレッドを作ります)という制限があったため、演算処理などを32bitにするという用途位ではないかと思います。

 Generic ThunkはThunk系のAPIを使用して実装するため比較的簡単ですが、Flat Thunkの場合はSDKに付属しているThunk Compilerを使用して、変換するためのDLLを16bit側、32bit側と用意しなくてはなりません。
 私も昔、32bit版のドライバがなかったので、このFlat Thunkを使用して32bitアプリケーションから16bitのDLL呼び出して作ったことがあります。結構めんどくさかったのですが、動いたときは結構感動物でした。思ったほど遅くもなりませんでしたし。

ブログ気持玉

クリックして気持ちを伝えよう!

ログインしてクリックすれば、自分のブログへのリンクが付きます。

→ログインへ

なるほど(納得、参考になった、ヘー)
驚いた
面白い
ナイス
ガッツ(がんばれ!)
かわいい

気持玉数 : 0

この記事へのコメント

masas
2008年05月28日 11:35
Thunk関係を目にしたので一言。
昔16bitIMEをNT3.5で動かすためのモジュールを作ったことがあります。IME Bridgeという製品で、C.F.Computingに在籍中に作りました。
このときGenericThunkをごりごり使った記憶があります。いや~懐かしいなあ~
2008年05月29日 01:00
masasさん、コメントありがとうございます。

IME Bridgeは使っていたかどうか、記憶が定かではありませんが、(Inside)Win/Vはベータのころからめちゃめちゃ使っていました。ほんとうにあの製品には感謝しています。

懐かしいです。

この記事へのトラックバック