このサイトでは、分析、カスタマイズされたコンテンツ、および広告に Cookie を使用します。このサイトを引き続き閲覧すると、Cookie の使用に同意するものと見なされます。
Hi, Developers,
straightapps.com
作成 November 1, 2018
トップページ > Windows トップ > 32/64 ビット EXE/DLL チェッカー
line
Windows 開発
line

x86x64checker は、Windows の .exe および .dll のビット数を調べるユーティリティです。

Windows 7 のサポート期限もいよいよ来年(2020 年)の 1 月と迫り、Windows 10 への対応が最終盤に入っています。

Windows 10 には 32 ビット版もありますが、新しいPCの多くは、というよりほとんどは、64 ビット版を搭載しています。 わざわざ選ばない限りは、64 ビット版の Windows 10 (Home または Pro) を使うことになります。

64 ビット版の Windows でも、従来の 32 ビットプログラムは、基本的にはそのまま動作します。 それは 64 ビット版 Windows が、32 ビットプログラムをそのまま動作させるのではなく、 Windows on Windows 64 ( WOW64 と略されます。 ) という機能を搭載しているためです。 話としてはワンクッションおくのでパフォーマンスが低下するのですが、今どきの CPU であれば、無視できる程度のようです。

すべてのソフトを 64 ビットに移行させず、わざわざそんなことをするのは、 64 ビットでビルドした exe からは、32 ビットの dll を呼び出せない、という部分が大きいようです。 もちろん、その逆、32 ビットでビルドした exe からは、64 ビットの dll を呼び出すことはできません。

そこそこの規模のプログラムなら、DLL をすべて 64 ビットにビルドしなおして、プログラム本体も 64 ビット化する、というのは大変な作業です。 32 ビットのまま動作させることができれば、大きく意識しなくていいので、助かります。

それでも、すべての 32 ビットプログラムが 64 ビットOSで動作するわけではありません。 特に、ハードウェア制御を含むプログラムでは、ドライバが 64 ビットになってしまい、32 ビットのままでは動作しません。 そこで、そういうものだけ 64 ビット化するわけですが、32 ビットの DLL は呼び出せません。

Windows プログラムを 64 ビット化するとき、利用する DLL も 64 ビットでビルドしなおせば問題ありません。 が、外部から提供されたりした「ソースコードのない」DLL だと、ビルドしなおすことはできません。 64 ビット版を探したり、新たに提供を受けたりしなくてはなりません。

プログラムを確認したり、環境を作成したりするときに、exe や dll が 32 ビットなのか、64 ビットなのかを知りたいことがあります。 exe は比較的確認しやすいのですが、dll はかなり面倒です。

このユーティリティを使えば、外部提供の dll や、過去に作成した dll でも、ビット数を調べることができます。 同じ仕組みですので、実行ファイルのビット数も、調べることができます。

▼ セクション一覧

ツールなしで調べる方法
用意したツール
判定方法
DLL の場合と出現位置
もう少し詳しく・・・
ダウンロード
自分が 64 ビットOSで動作しているか

なお、本サイトのご利用に際しては、必ずプライバシーポリシー(免責事項等)をご参照ください。

ツールなしで調べる方法

投稿 November 1, 2019

64 ビットの Windows でプログラムを実行したとき、 タスクマネージャーを起動すれば、それが 64 ビットで動作しているか、32 ビットで動作しているかがわかります。

タスクマネージャー

例えばタスクマネージャーは 64 ビットで動作しているので注釈なし、 Microsoft Word は 32 ビットで動作していることがわかります。

また、ちゃんとインストールされたソフトなら、 32 ビットの場合は C ドライブや D ドライブなど指定したドライブの Program Files (x86) フォルダに、 64 ビットの場合は C ドライブや D ドライブなど指定したドライブの Program Files フォルダに インストールされます。 実行ファイルがどこにあるかがわかれば、インストール先から判断できます。

▲ページ先頭へ

用意したツール

投稿 November 1, 2019

このページで紹介しているツールをダウンロードし、起動すると、次のような画面が出ます。

スクリーンショット

書いてある通りですが、調べたい dll や exe を、エクスプローラーなどからこのダイアログにドロップするか、 フルパスを入力して「判定する」ボタンをクリックしてください。 すぐに結果が表示されます(判定方法は後述します)。

64 ビット

64 ビット

dll や exe ではないファイルを入力すると、 たまたま条件が一致すれば結果が表示されますが(もちろん正しくないでしょう)、 結果として「判定できませんでした」と表示されます。

判定できませんでした

▲ページ先頭へ

判定方法

投稿 November 1, 2019

基本的な情報は、ネットですぐに見つかります。 バイナリを見て、決まったバイト列があるかどうかで判断する、です。

Windows 10 + Visual C++ 2015 で、コード追加は何もないダイアログアプリを、32 ビット(x86)、Debug でビルドしました。 ネットでは 0x0080 付近で、とありましたが、 デバッグ情報があるのか、0x0130 から、(いずれも 16 進数で)50 45 00 00 4C 01 がありました。 この並びが現れたら、32 ビット exe/dll です。

同じように、64 ビット(x64)、Debug でビルドすると、 0x0118 から、(いずれも 16 進数で)50 45 00 00 64 86 がありました。 この並びが現れたら、64 ビット exe/dll です。

0x50 0x45 は "PE" で、 0x00 0x00 が続き、 そのあとに x64 か x86 かを示すコードが続く、でよさそうです。

ちなみに、Visual Studio 2015 などで exe ファイルをそのまま開くと、リソースを開いてしまいます。

バイナリエディタでファイルを開くには、 「ファイル」メニューの「開く」の中から「ファイル...」を選び、 開きたいファイルを選んだあと、「開く」ボタンの右端の下矢印をクリックして、 「ファイルを開くアプリケーションの選択...」を選びます。

開くプログラムを選択

スクロールすると、下のほうに「バイナリ エディター」がありますので、 それを選択して、OK ボタンをクリックします。

バイナリエディタ

あとは通常と同じように、Ctrl + f で検索ウィンドウを開き、 「現在のドキュメント」から 50 45 を検索します。

▲ページ先頭へ

DLL の場合と出現位置

投稿 November 1, 2019

自分で作成した 32ビットの DLL を開いてみると、 (いずれも 16 進数で)50 45 00 00 4C 01 が、0x0110 から見つかりました。 位置は実行ファイルと異なります。

自分で作成していない DLL の場合はどうでしょうか。 やはり 0x0110 から同じ並びが見つかりました。 念のため、もう1つ調べてみると、0x0128 から、同じ並びが見つかりました。

では、スタティックリンクではない LIB はどうでしょう。 0x50 0x45 の並びは、ありませんでした。 もう1つ確認してみても、ありませんでした。 少なくともこの方法では、確認できません。

スタティックリンクの LIB なら、判定できるでしょうか? 残念ながら、0x50 0x45 は、ありませんでした。 (データの一部ではなさそうな)0x4C 0x01 もありません。

詳しくは、Microsoft の Windows デベロッパーセンター 「PE Format」 に英語で詳しく書かれているようですが、すぐには見つかりませんでした。

本プログラムでは、十分余裕をみて、最初から最大 0x10000 ( 65,536 バイト、64 KB。 ) バイトのうちに、 2種類の識別コードのうちのどちらかが出現するかどうかで判定しています。 ですので、画像ファイル等で、たまたま一致するバイト並びが入ってしまうと、誤判定となります。

▲ページ先頭へ

もう少し詳しく・・・

投稿 November 1, 2019

せっかく調べましたので、もう少し詳しくメモしておきます。

先ほどと同じ、Microsoft の Windows デベロッパーセンター 「PE Format」 を見てみます。

(いずれも 16 進数で)50 45 00 00 4C 01(32 ビット)は、 「PE フォーマットの Machine Types フィールド」です。 50 45 が "PE" を表し、 00 00 は、Machine フィールドで、Machine Type を定義している、という意味です。

0x8664 は、IMAGE_FILE_MACHINE_AMD64 というシンボルで、x64 です。 0x014C は、IMAGE_FILE_MACHINE_I386 で、Intel 386系(x86)です。 なので 4C 01は x86、 バイナリで並び順が逆なのは、ビッグエンディアンだからでしょう。 x64 も同様です。

▲ページ先頭へ

ダウンロード

投稿 November 1, 2019

ここで用意した CheckX86X64.exe は、単体で動作する 32 ビットプログラムです。

zip 圧縮したファイルのダウンロードは このリンクをクリックしてください。 正しい zip ファイルのタイムスタンプは 2019/11/1 15:10:15、 正しい実行ファイルのタイムスタンプ(更新日時)は 2019/10/11 13:28:04 で、 zip 内は実行ファイル1つだけです。 zip ファイルサイズは 1,888,618 バイト、 実行ファイルのサイズは 3,497,472 バイトです。 パスワードは設定していません。

私なら、完全に信用できるサイト以外からのダウンロードはしませんが、 興味がある方のために、実行ファイルを圧縮したものを置いています。 安全に努めているマシンで用意したファイルですが、お試しいただく場合は、完全に自己責任でお願いします。
OSは Windows 7 以降、ランタイムなど環境の用意は 特に必要ない ( MFC ライブラリはスタティックリンクしています。 ) と思います。

▲ページ先頭へ

自分が 64 ビットOSで動作しているか

投稿 November 1, 2019

おまけです。

自分が 64 ビットOSで動作しているのかを調べるのが面倒でした。 以下のような判定で、いけそうです。 この関数は、64 ビットOSで動作しているときは true を、そうでない場合(32 ビットOSまたは判定不能)は false を返します。

bool IsOSx64(void)
{
	BOOL bRet = FALSE;

	// WOW64 とは、64 ビットOS上で 32 ビットアプリを動作させるものです。
	// 64 ビットアプリ + 64 ビットOS → FALSE
	// 64 ビットアプリ + 32 ビットOS → 動作しない
	// 32 ビットアプリ + 64 ビットOS → TRUE(WOW64)
	// 32 ビットアプリ + 32 ビットOS → FALSE
	IsWow64Process(GetCurrentProcess(), &bRet);
	if (bRet) {
		// 32 ビットアプリが 64 ビットOSで動作しています。
		return true;					// WOW64 で動作中
	}

	// 64 ビットプログラムが 64 ビットOSで動作中は、FALSE が返ります。
	SYSTEM_INFO si;
	GetNativeSystemInfo(&si);				// _WIN32_WINNT を 0x0501 以降に設定する必要あり
	switch (si.wProcessorArchitecture) {

	case PROCESSOR_ARCHITECTURE_AMD64:			// x64(AMD/Intel)
		// WOW64 で動作中の 32 ビットプログラムでもこの値が返るようです。
		return true;					// 64 ビットプロセッサー

	case PROCESSOR_ARCHITECTURE_ARM:			// ARM
	case PROCESSOR_ARCHITECTURE_IA64:			// Intel Itanium-based
		break;						// 判定対象外

	case PROCESSOR_ARCHITECTURE_INTEL:			// x86
		//	32 ビットアプリが 32 ビットプロセッサで動作しています。
		break;

	case PROCESSOR_ARCHITECTURE_UNKNOWN:		// 不明
	default:
		break;
	}
	return false;
}

マイクロソフトの「アップグレード時の潜在的な問題の概要 (Visual C++)」にある、 「32 ビットと 64 ビット」 も参考になるかも知れません。

▲ページ先頭へ
line
関連トピックス
line

Windows 開発トップ
Windows 開発関連の情報を、書いています。

line
その他のおすすめ
line

おすすめ記事はありません。



© 2017-2019 StraightApps.com 無断転載を禁じます。No reproduction without permission.