「マイクロソフト系技術情報 Wiki」は、「Open棟梁Project」,「OSSコンソーシアム .NET開発基盤部会」によって運営されています。
目次 †
概要 †
WOW64についての情報を纏めている。
とは? †
- WOW64(Windows-on-Windows 64-bit)は、64ビット版のWindows OS上で32ビットアプリケーションを動作させるための互換レイヤー(サブシステム)。
- 64ビットOSは本来64ビットアプリのみをネイティブで動かしますが、過去の資産(32ビットアプリ)も実行できるようにするためにWOW64が存在。
仕組み †
32ビットアプリ → (が、64bit OS上の)WOW64レイヤー(で動作し、) → 64ビットカーネル(との間を仲介する)という流れで動作
- カーネルは64ビットのみで、32ビットのカーネルをエミュレーションしている訳ではない。
- 32ビットコードはユーザーモードで、WOW64上で32bitで動作し、64ビットカーネルとの仲介がされる。
- カーネルモード・ドライバは32ビット非対応(64ビット専用が必要)。
- WOW64はCPUの互換モード(IA-32eの互換モード)と組み合わせて実現。
API変換 †
32ビットアプリが呼び出すWin32 APIを、64ビットカーネル向けに変換。
アドレス空間の制御 †
32ビットアプリは最大4GBの仮想メモリ空間を利用可能(通常2GB)。
ファイルシステム・リダイレクト †
- C:\Windows\System32 は64ビットDLL用。
- 32ビットアプリが利用する System32 を C:\Windows\SysWOW64 にリダイレクト。
レジストリ・リダイレクト †
- HKLM\Software は64ビット用。
- 32ビットアプリが利用する HKLM\Software\WOW6432Node にリダイレクト。
FAQ †
Q: 16ビットアプリは動く? †
A: 64ビットWindowsでは16ビットアプリは動かない(NTVDMがない)。
Q: ARM64版Windowsでは? †
A: WOW64の仕組みを拡張したWOW64ECでx86アプリをエミュレーションできる。
Q: 64ビットDLLは呼び出せる? †
A: 結論から言うと、WOW64上の32ビットVB6アプリから64ビットDLLを直接呼び出すことはできない。
- WOW64はシステムコールやOS APIを変換するが、アプリコードとDLL間の呼び出しを変換する仕組みはない。
プログラム開発 †
64bitかWOW64(32bit)かを見分ける †
タスクマネージャ等 †
名前の後ろに
表示される。
システムファイル、レジストリのリダイレクト †
レジストリ・リダイレクター †
ファイルシステム・リダイレクター †
リダイレクトされないフォルダ †
Program Files のフォルダの場合は少々勝手が違ってきます。
- [System.Environment.SpecialFolder?.ProgramFiles?]のようにフォルダ情報を取得すると、
返ってくるのは、[%systemdrive%\Program Files (x86)]フォルダになります。
- また、[%systemdrive%\Program Files]フォルダに対してファイルの作成などを
おこなってもリダイレクトはされず、そのままそのフォルダに I/O がおこなわれます。
リダイレクタが問題になるケース †
- 32bitアプリケーションから64bitコマンドを実行する場合、
逆に、リダイレクタが問題になる(通常、32bitコマンドを参照するため)。
- この様なケースでは、
- %windir%\System32 ディレクトリの代わりに
- %windir%\Sysnative ディレクトリを指定する。
- 事例を見ると、シェル・スクリプトで発生することが多い模様。
(自作アプリだと、自アプリのTarget CPUや、パス環境変数、
カレント・ディレクトリからの相対パスなどを気にするので)
COM開発・利用 †
登録 †
開発したCOMを登録するRegsvr32にも32版64版があります。
- 64 ビット版は %systemroot%\System32\regsvr32.exe です。
- 32 ビット版は %systemroot%\SysWoW64\regsvr32.exe です。
参照URL: http://support.microsoft.com/kb/249873/ja
DCOM †
COMの設定を行うdcomcnfg.exeにも32bit版があるもよう。
dcomcnfg.exe /32
COMクライアント †
VBS †
Office VBA †
- Officeは64bitOS上でも32bitを使用した方が良い(実績的に)。
64bitのOfficeを採用する場合は色々調査・検証が必要になる。
ASP †
コチラを参照。
データプロバイダ †
ここでは、32bit用、64bit用データプロバイダに起因する問題をまとめています。
ADO.NETデータプロバイダ一般的なトピックはコチラを参照下さい。
- ドライバはWOW64上で動作しないため64bitプラットフォームでは64bit対応
されたものを使用する必要があるのですが、ODBC、OLEDBドライバなどは所謂ドライバ
(デバイス・ドライバ、バス・ドライバ、フィルタ・ドライバ)とは異なるため、
WOW64上でも使用可能ですが、詳細は其々サポート状況を確認が必要です。
- 各プラットフォーム(32bit or 64bit + 対象データソース)の
サポートのあるODBC、OLEDBドライバなどが用意されているか確認が必要です。
ODP.NET †
組合 †
- ODP.NETのDLL(Oracle.DataAccess?.dll)は32/64bit決め打ちで、anyCPUになっていないので、
クライアントプログラムのターゲット(32/64bit)に一致したものをインストールする必要がある。
- 警告(warning)は、
上位プログラムがanyCPU、下位プログラムが32/64bit決め打ちの場合に出力される。
Visual Studio・MSbuildの設定(=*.cs or vbproj、*.slnファイル)が合っていれば問題はない。
インストール †
- 64bit環境で、DBMSが同居しており、クライアントがWOW64で32bitの場合、
Oracleクライアント32bitをインストールする必要がある。
- 最近マネージドのOracleクライアント不要のODP.NETがリリースされたようですので、
こちらを使用すれば簡単かもしれません。詳しくはコチラを参考にして下さい。
ODBC †
Windows 7(64bit) / Office 2010(32bit) 環境での検証結果
- 64bit の ODBCアドミニストレータ(※1)の[ユーザDSNタブ]でExcel Filesを選択したところ
エラーとなり、追加ボタンで追加できるドライバーの一覧でも Excel はありませんでしたので、
この構成の場合32bit のExcel Files ODBC ドライバのみが追加されるもようです。
- 32bit の ODBCアドミニストレータ(※2)の[ユーザDSN]タブではExcel Files を選択できる。
※1:C:\Windows\System32\odbcad32.exe
※2:C:\Windows\SysWOW64\odbcad32.exe
OLEDB †
なお、OLEDBについては、2008R2 64bit上で32bit、64bitの両方の
Jet OLE DB プロバイダが存在し、それぞれ動作したことを確認しています。
問題は、OLEDBが64ビットに対応していない件ですが、以下の代替のドライバがあり、
これをインストールしてConnectString?を変更することにより、プログラム変更なく動作しました。
- Microsoft Access データベース エンジン 2010 再頒布可能コンポーネント
OO4O †
- OO4Oはdisconで、64bit対応がされていないようです。
- また、ODAC 11.2.0.3.0でWindows Server 2008 R2がサポートされているように見えますが、
実際は、WOW64環境もサポートされていないようです(Windows Server 2008 R2以降への以降はNG)。
その他 †
こちらにも同様に32bit設定と64bit設定があるようです。
ホストするアプリが32bitの場合、対象アプリが64bitでも、
32bitのコード・アクセス・セキュリティ ポリシー設定を参照するようです。
IE9(32bit) → Excel2010(64bit) → DLL(64bit) といった動作をする場合、
実行するプロセスは 64bit だが、CAS 設定は IE9 から、32bit のものを参照している。
参考情報 †
Tags: :Windows, :移行, :.NET開発