W32 W64プログラミング

提供:yonewiki

言語と開発環境へ戻る。

 

概要

 32bitWindowsで64bitアプリを動かすことはできません。


 逆は出来ます。Wow64システムがWin32環境をシミュレートするように動作しますので、64bitWindowsはとても優秀なように感じてしまいます。しかしながら、64bitWindowsからWin32アプリを動かして、そのアプリからWin64DLLや外部のWin64アプリを呼び出して直接連動したりすることはできません。逆はうまくやればできます。64bitWindowsでWin64アプリを動かして、Win32DLLや外部のWin32アプリを呼び出すと、Win32アプリと同じレベルの動作をするように変更することで対応はできます。これはWin32とWin64でポインター変数のようなアドレスを記憶する変数の大きさが違うからです。あらゆるウィンドウオブジェクトはハンドルのようなアドレス変数で、管理されていますから、アドレスを覚える変数は必ず使われます。それが64bitWindowsなら64bit=8Byteで管理されていて、32bitWindowsなら32bit=4Byteで管理されています。32bitだとアドレスでいうと4ギガ個程度のアドレスしか扱えません。昔は4ギガもあれば十分だったんですけど、最近はそうでもなくなってきています。64bitアプリと32bitアプリを相互運用するにはそれなりのコツがいるということになります。呼び出しはできないけど、間接的に連動することはできます。


 Win64からWin32を呼び出すとなると、すべてがWin32ベースで動作することで、連携することができます。したがって、Win64を使っていると思っていてもいつの間にかWin32なっていることはあります。自分自身が今、何ビットアプリとして動作しているかを確認することはできます。


 例えば、WindowsConsoleアプリケーションをVisusal Studio Community2015だとバッチビルドを選択するとDebugのX86とX64。ReleaseのX86とX64の4種類があらかじめビルドできるようになっています。そこで、以下のようなコードを記述すると、どっちで動作しているか、確認できます。Win32やWin64のウィンドウアプリを作成している場合でも以下のコードを適当な部分に埋め込むことで、確認することができます。


// Win32Console2Win64.cpp : コンソール アプリケーションのエントリ ポイントを定義します。
//
#include<Windows.h>
#include<stdio.h>
#include "stdafx.h"


int main()
{
	BOOL bIsWow64 = FALSE;
	IsWow64Process(GetCurrentProcess(), &bIsWow64);
	if (TRUE == bIsWow64) {
		printf("このプロセスはWOW64(32bit)です。\n");
	}
	else {
		printf("このプロセスは64bitです。\n");
	}
	return 0;
}

  言語と開発環境へ戻る。