JavaScript 版「JS 版 32/64 ビット EXE/DLL チェッカー」が リリースされています。インストール不要で判定できます。
32 ビットが主力だった Windows 7 のサポート期限も 2020 年 1 月に終了し、Windows 10 への対応が必要となりました。
Windows 10 には 32 ビット版もありますが、新しい PC の多くは、というよりほとんどは、64 ビット版を搭載しています。 わざわざ選ばない限りは、64 ビット版の Windows 10 (Home または Pro) を使うことになります。
64 ビット版の Windows でも、従来の 32 ビットプログラムは、基本的にはそのまま動作します。
それは 64 ビット版 Windows が、32 ビットプログラムをそのまま動作させるのではなく、
すべてのソフトを 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 でも、ビット数を調べることができます。 同じ仕組みですので、実行ファイルのビット数も、調べることができます。
なお、本サイトのご利用に際しては、必ずプライバシーポリシー(免責事項等)をご参照ください。
投稿 November 1, 2019
64 ビットの Windows でプログラムを実行したとき、 タスクマネージャーを起動すれば、それが 64 ビットで動作しているか、32 ビットで動作しているかがわかります。
例えばタスクマネージャーは 64 ビットで動作しているので注釈なし、 Microsoft Word は 32 ビットで動作していることがわかります。
また、ちゃんとインストールされたソフトなら、 32 ビットの場合は C ドライブや D ドライブなど指定したドライブの Program Files (x86) フォルダに、 64 ビットの場合は C ドライブや D ドライブなど指定したドライブの Program Files フォルダに インストールされます。 実行ファイルがどこにあるかがわかれば、インストール先から判断できます。
JavaScript 版「JS 版 32/64 ビット EXE/DLL チェッカー」が リリースされています。インストール不要で判定できます。
投稿 November 1, 2019
このページで紹介しているツールをダウンロードし、起動すると、次のような画面が出ます。
書いてある通りですが、調べたい dll や exe を、エクスプローラーなどからこのダイアログにドロップするか、 フルパスを入力して「判定する」ボタンをクリックしてください。 すぐに結果が表示されます(判定方法は後述します)。
dll や exe ではないファイルを入力すると、 たまたま条件が一致すれば結果が表示されますが(もちろん正しくないでしょう)、 結果として「判定できませんでした」と表示されます。
JavaScript 版「JS 版 32/64 ビット EXE/DLL チェッカー」が リリースされています。インストール不要で判定できます。
投稿 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 を検索します。
投稿 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」 に英語で詳しく書かれているようですが、すぐには見つかりませんでした。
本プログラムでは、十分余裕をみて、最初から最大
投稿 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 圧縮したファイルは、次の URL に置いていますので、下記文字列をブラウザの URL 欄に入力して、ダウンロード可能です。
https://www.straightapps.com/download/x86x64checker.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 以降、ランタイムなど環境の用意は
投稿 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 ビット」 も参考になるかも知れません。
Windows 開発トップ
Windows 開発関連の情報を、書いています。
おすすめ記事はありません。