64bit 環境 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 の仕組みを 下図に示す 32bit プロセス 64bit プロセス 32bit kernel32.dll 32bit ntdll.dll WOW64.DLL WOW64WIN.DLL WOW64CPU.DLL 64bit kernel32.dll 64bit NTDLL.DLL NTOSKRNL.EXE -1-
上記の 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 フォルダに追加しないと 正しく認識されない ) -2-
ツールボックスのカスタマイズ 標準で Visual Studio のツールボックスに表示されて居ないコンポーネント ( 此処で例と仕て取り上げる Winsock コンポーネント等 ) を追加して使用出来る様にする手順は 下記の通りで有る 此処では ツールボックスで コンポーネントを追加するタブ部を開き 余白部分で右クリックして表示されるポップアップメニューで アイテムの選択 をクリックする 追加する COM コンポーネントは 既存のタブでは無く 追加コンポーネント 等の名前のタブを追加し 其処にアイテムを追加する事が メンテナンス上 望ましい -3-
下記の ツールボックスアイテムの選択 ダイアログの COM コンポーネント タブに システムフォルダに追加したコンポーネントが表示されて居ない場合は 参照 ボタンをクリックして 参照 ダイアログで 前以てシステムフォルダに追加したコンポーネントファイルを指定する -4-
併し 此処で 自己登録に失敗しました と謂うエラーメッセージが表示され ツールボックスアイテムの選択 ダイアログの COM コンポーネント タブに 追加したコンポーネントが表示されない場合が有る 此の場合は コマンドプロンプトで Regsvr32 を用いて 手動で登録する必要が有る コマンドプロンプトは メニューの プログラムとファイルの検索 で cmd と入力して 出現した cmd.exe を右クリックして ポップアップメニューの 管理者として実行 をクリックする (Ctrl+Shift を押し乍 Enter 入力しても 管理者権限で起動する事が出来る ) -5-
コマンドプロンプト (DOS 窓 ) で 下記の様に入力して 追加したコンポーネントを登録する 上記で cd.. は 一階層上のフォルダ ( ディレクトリ ) に移動するコマンドで有る (Change Directory) 上記で cd syswow64 は 現在の階層下の syswow64 フォルダ ( ディレクトリ ) に移動するコマンドで有る (DOS プロンプトでは 大文字と小文字は区別されない ) 上記で dir regsvr32.* は 現在の階層にの regsvr32.exe が存在する事を確認するコマンドで有る ( 予め syswow64 フォルダに regsvr32.exe が存在する事を確認して居るなら不要 ) 上記で regsvr32 mswinsck.ocx は 追加したコンポーネントをシステムに登録するコマンドで有る ( 今回は Winsock コンポーネントの MSWINSCK.OCX を登録 ) 下記のダイアログが表示されゝば 登録に成功した -6-
手動でのコンポーネントの登録に成功すれば Visual Studio に戻り 下記の ツールボックスアイテムの選択 ダイアログの COM コンポーネント タブで Microsoft WinSock Control version 6.0 にチェックを入れて OK ボタンをクリックする 此れで Visual Studio のツールボックスに 追加したコンポーネントが追加され フォームに張り付ける事が出来る様に成る 併し デバッグ実行すれば フォームの初期化時に例外が発生し プログラムを実行する事は出来ない フォーム生成時の例外で有る為 フォームは表示すらされない 32bit のコンポーネントを含むプロジェクトは 更に 其のプラットホームを Any CPU から x86 に変更する必要が有る -7-
64bit 環境でのアクティブソリューションプラットフォームの変更 SysWOW64 フォルダには 32bit 版の System32 フォルダに格納されて居るファイルが 粗其の儘 格納されて居る 即ち エミュレートして居ると謂うよりは 32bit 版の Windows OS が 殆ど其の儘 装備されて居て 其の上で Win32 アプリケーションを実行して居ると謂う事で有る 従って 通常は 32bit アプリケーションを実行する時 其のプラットフォームを意識する必要は無いが 32bit コンポーネントを使用して居る場合は 使用するプラットフォームを 明示的に指定して遣る必要が有る 其処で メニューの ビルド から 構成マネージャー を表示させ アクティブソリューションプラットフォームを Any CPU から x86 に変更する アクティブソリューションプラットフォームの選択肢に x86 が無ければ 其の下のプルダウンリストの 新規作成 で x86 を作成する 猶 ビルド メニューの中に 構成マネージャー が表示されて居ない場合は メニューの ツール オプション の左側にあるリストから プロジェクトおよびソリューション を選び ビルド構成の詳細を表示 にチェックを入れる プラットフォームを x86 に変更した場合 bin フォルダの中に x86 と謂う名前のフォルダが自動作成され 其処が Application.StartupPath と成る -8-