■ 64bit 環境で 32bit コンポーネントの利用 ■
Windows 7 や 8 の出現で、愈々、64bit 環境も普及し始めて来た。64bit 環境に於いては、64bit 用に最 適化された64bit コンポーネントを使用するのが本筋で有ろうが、64bit 環境に於いても、32bit コンポ ーネントを使用し度い場合が有る。
過去の遺物(レガシ)と仕て切り捨てるのではなく、良い物は良い物と仕て有効利用すると謂う観点か ら、此処では、64bit 環境に於いて、32bit コンポーネントを利用する方法に付いて説明する。
■ 64bit 環境での COM コンポーネントの追加
COM コンポーネントは、32bit 環境(Windows XP 等)では、システムフォルダ(Windows フォルダ) 内のSystem フォルダか System32 フォルダに格納したが、64bit 環境(Windows 7 等)では、同階層 のSysWOW64 フォルダに格納する。
WOW64(Windows 32bit emulation on Windows 64bit)は、64bit Windows OS 上で 32bit Windows アプリケーションの実行環境をエミュレートする為のシステムで有り、SysWOW64 フォルダは、従来 の32bit コンポーネントを、格納する為のフォルダで有る。
64bit 版 Windows OS のカーネルは、元々Win64 と謂うネイティブな API セットしかサポートして居 らず、32bit や 16bit の API(Win32 や Win16)は含まれて居ない。併し、此れでは従来のアプリケー ションを利用出来ないので、Win32 アプリケーションを実行する為の仕組みが用意されて居る。此れが WOW64 で有る。WOW64 の仕組みを、下図に示す。
6
64
4b
bi
it
t
環境
環
境
32bit プロセス 32bit kernel32.dll 32bit ntdll.dll WOW64.DLL WOW64WIN.DLLWOW64CPU.DLL 64bit kernel32.dll 64bit
プロセス
-2-
上記のWOW64.DLL は、WOW64 を構成するコアコンポーネントで、NTOSKRNL.EXE への中継を行 うサンク(呼出)が含まれて居る。ファイルシステムリダイレクションやレジストリリフレクション等 の処理も行う。
WOW64WIN.DLL は、GUI(Graphics User Interface)関連の API(WIN32K.SYS)への中継を行う サンクが含まれて居る。
WOW64CPU.DLL は、ホスト CPU の抽象化を行う為のライブラリで、32bit モードと 64bit モードの 切り替えや、WOW64 内に於ける 32bit CPU のスレッドコンテキストの切り替え等を行う。
猶、Win32 や Win64 API で利用されるハンドル情報は 16bit 幅には格納出来ないので、WOW64 では、 Win16 アプリケーションを利用する事は出来ない。
此処では、例と仕て、通信を行うWinsock コンポーネント(MSWINSCK.OCX と MSWINSCK.DEP) をsysWOW64 フォルダに追加する。下図は、Winsock コンポーネントを sysWOW64 フォルダに追加 した処で有る。
※ 呉々も、従来の様に、System や System32 のフォルダに追加しない様に(sysWOW64 フォルダに 追加しないと、正しく認識されない)。
■ ツールボックスのカスタマイズ 標準でVisual Studio のツールボックスに表示されて居ないコンポーネント(此処で例と仕て取り上げ るWinsock コンポーネント等)を追加して使用出来る様にする手順は、下記の通りで有る。 此処では、ツールボックスで、コンポーネントを追加するタブ部を開き、余白部分で右クリックして表 示されるポップアップメニューで『アイテムの選択』をクリックする。 ※ 追加する COM コンポーネントは、既存のタブでは無く、「追加コンポーネント」等の名前のタブを 追加し、其処にアイテムを追加する事が、メンテナンス上、望ましい。
-4-
下記の『ツールボックス アイテムの選択』ダイアログの『COM コンポーネント』タブに、システムフ ォルダに追加したコンポーネントが表示されて居ない場合は、『参照』ボタンをクリックして、『参照』 ダイアログで、前以てシステムフォルダに追加したコンポーネントファイルを指定する。
併し、此処で、『自己登録に失敗しました』と謂うエラーメッセージが表示され、『ツールボックス ア イテムの選択』ダイアログの『COM コンポーネント』タブに、追加したコンポーネントが表示されな い場合が有る。 此の場合は、コマンドプロンプトでRegsvr32 を用いて、手動で登録する必要が有る。コマンドプロン プトは、メニューの「プログラムとファイルの検索」で、cmd と入力して、出現した cmd.exe を右クリ ックして、ポップアップメニューの『管理者として実行』をクリックする(Ctrl+Shift を押し乍 Enter 入力しても、管理者権限で起動する事が出来る)。
-6- コマンドプロンプト(DOS 窓)で、下記の様に入力して、追加したコンポーネントを登録する。 ※ 上記で、cd .. は、一階層上のフォルダ(ディレクトリ)に移動するコマンドで有る(Change Directory)。 ※ 上記で、cd syswow64 は、現在の階層下の sysWOW64 フォルダ(ディレクトリ)に移動するコマ ンドで有る(DOS プロンプトでは、大文字と小文字は区別されない)。
※ 上記で、dir regsvr32.* は、現在の階層にの regsvr32.exe が存在する事を確認するコマンドで有る (予めsysWOW64 フォルダに regsvr32.exe が存在する事を確認して居るなら不要)。
※ 上記で、regsvr32 mswinsck.ocx は、追加したコンポーネントをシステムに登録するコマンドで有 る(今回は、Winsock コンポーネントの MSWINSCK.OCX を登録)。
手動でのコンポーネントの登録に成功すれば、Visual Studio に戻り、下記の『ツールボックス アイテ ムの選択』ダイアログの『COM コンポーネント』タブで、Microsoft WinSock Control version 6.0 に チェックを入れて、OK ボタンをクリックする。
此れで、Visual Studio のツールボックスに、追加したコンポーネントが追加され、フォームに張り付 ける事が出来る様に成る。
併し、デバッグ実行すれば、フォームの初期化時に例外が発生し、プログラムを実行する事は出来ない。 フォーム生成時の例外で有る為、フォームは表示すらされない。
32bit のコンポーネントを含むプロジェクトは、更に、其のプラットホームを、『Any CPU』から『x86』 に変更する必要が有る。
-8-
■ 64bit 環境でのアクティブソリューションプラットフォームの変更
SysWOW64 フォルダには、32bit 版の System32 フォルダに格納されて居るファイルが、粗其の儘、格 納されて居る。即ち、エミュレートして居ると謂うよりは、32bit 版の Windows OS が、殆ど其の儘、 装備されて居て、其の上で、Win32 アプリケーションを実行して居ると謂う事で有る。 従って、通常は、32bit アプリケーションを実行する時、其のプラットフォームを意識する必要は無い が、32bit コンポーネントを使用して居る場合は、使用するプラットフォームを、明示的に指定して遣 る必要が有る。 其処で、メニューの『ビルド』から『構成マネージャー』を表示させ、アクティブソリューションプラ ットフォームを『Any CPU』から『x86』に変更する。 アクティブソリューションプラットフォームの選択肢に『x86』が無ければ、其の下のプルダウンリス トの『新規作成』で『x86』を作成する。 ※ 猶、『ビルド』メニューの中に『構成マネージャー』が表示されて居ない場合は、メニューの『ツー ル』→『オプション』の左側にあるリストから『プロジェクトおよびソリューション』を選び、『ビ ルド構成の詳細を表示』にチェックを入れる。 プラットフォームを『x86』に変更した場合、bin フォルダの中に『x86』と謂う名前のフォルダが自動 作成され、其処が、Application.StartupPath と成る。