Win32APIって、32bitアプリしか使えないイメージ。
64bitアプリでは使えないかもしれないという思い込みが。
試しに作ってみる。
さきに結論からいうと
Win32APIは64bitでも使えるっぽいです。
実践の前に、32ビットと64ビットの概要をまとめてみました。
32ビット、64ビットとは
世間で言っている32bit/64bitとは。
まず「ビット」とは、
1と0の2つの情報しか持たない単位のことで、2進数なんて言ってます。
マトリックスで0と1がファーってなっているあれです。
32bitとは、1ビットが32個のこと。
電卓(プログラマー)を例にいうと・・・
2進 | 11111111111111111111111111111111 |
10進 | 4294967295 |
16進 | FFFFFFFF |
こんなかんじです。一方、
64bitとは、1ビットが64個のこと。
電卓(プログラマー)を例にいうと・・・
2進 | 1111111111111111111111111111111111111111111111111111111111111111 |
10進 | -1(電卓では表現しきれない?) |
16進 | FFFFFFFFFFFFFFFF |
1回のデータのやりとりで、
32個のビットのデータをやりとりできるか
64個のビットのデータをやりとりできるか
の違いになります。
なんとなく64bitのほうが性能良さげな感じ。と思って頂ければと思います。
さらに具体例をいうと
32bitPCのメモリは最大4GBまでといっていますが、なぜか。
計算してみましょう。
4GBとは、
1KB = 1024バイト
1MB = 1024KB
1GB = 1024MB
4GB = 1024バイト×1024KB×1024MB×4=計4294967296バイト
=16進数に表すと0x100000000
と、32bitの最大値0xFFFFFFFFを超えます。(0から数えるので実際はイコール)
それ以上の容量のメモリを使いたい場合は、64bitでないとダメといっている理由はこのことからになります。
実践
前置きは以上で、まず適当な関数を使ってみましょう。
Win32APIとは、初期のWindowsから存在していた汎用的な関数の詰め合わせセットみたいなものになります。
冒頭にもありましたが、そんなことからWin32APIは、32bitアプリしか使えないイメージを持っておりました。64bitアプリでは使えないかもしれないという思い込みがありました。
まずは普通に(32bitで)使ってみる。
今回はメモリを扱う関数を使って動かしながら確認してみます。
#include "stdafx.h"
#include <windows.h>
int _tmain(int argc, _TCHAR* argv[])
{
HGLOBAL hGbl;
// メモリ確保。戻り値はメモリアドレス
if ( (hGbl = GlobalAlloc( GPTR, 200 * 1024 )) != NULL ){
// メモリ解放
GlobalFree( hGbl );
}
return 0;
}
GlobalAllocのところでブレークポイントを止めて、戻り値hGblの値を見てみると
0xcccccccc → 0x00b87510
と何かしら値が入ってメモリ確保できております。
その次のGlobalFreeもエラーなく実行できました。
前述の32bitの16進数の最大値は0xFFFFFFFFなので桁数的には32bitと合っていますね。
64bitアプリでビルドして動かしてみる
構成マネージャを「Win32」→「x64」に変更して、リビルドします。
実行してみると・・・
GlobalAllocのところでブレークポイントを止めて、戻り値hGblの値を見てみると
0xcccccccccccccccc → 0x00000279d3a02820
と、アドレスの値の桁数が倍に。
何かしら値が入ってメモリ確保できております。
その次のGlobalFreeもエラーなく実行できました。
前述の64bitの16進数の最大値は0xFFFFFFFFFFFFFFFFなので桁数的には64bitと合っていますね。
これらを見てのとおり、64ビットでも特に意識することなく使えておりました。
注意点
注意点は、hGblのアドレスを「数値型」変数に保持するようなときは、サイズが64bit枠のものでないといけないということぐらい。
こんな使い方はなかなか無いとは思うけど参考になればと思います。
他、32bitのDLLに対しては、呼び出し側のexeは、32bitでないと動いてくれません。そうなると、さきほど確認したWin32APIの関数は、64bit用のDLLで動いていたという事になりますね。
最後まで見てくれてありがとう。