検索
特集

時代に遅れないためのWin64用アプリケーション開発64ビットコンピューティング最前線(2/3 ページ)

64ビット環境への理解も少しずつ深まってきた。今回は、64ビットWindows用アプリの開発について解説する。Win32との互換性などには注意してほしい。

PC用表示 関連情報
Share
Tweet
LINE
Hatena

新しいデータ型とヘルパー関数

 精度固定の整数については変数の長さを明示的に示すための型が新しく追加されています(Table9)。

内容
DWORD32 32ビット符号なし整数
DWORD64 64ビット符号なし整数
INT32 32ビット符号あり整数
INT64 64ビット符号あり整数
LONG32 32ビット符号あり整数
LONG64 64ビット符号あり整数
UINT32 32ビット符号なしINT32
UINT64 64ビット符号なしINT64
ULONG32 符号なしLONG32
ULONG64 符号なしLONG64
Table9 精度固定の整数

 ポインタに関する型およびマクロについては、それぞれTable10、11のようになっています。

内容
DWORD_PTR 符号なしlong型ポインタ
HALF_PTR 半分のサイズのポインタ
INT_PTR 符号ありint型のポインタ
LONG_PTR 符号ありlong型のポインタ
SIZE_T ポインタが参照できる最大限の値の型
SSIZE_T 符号ありのSIZE_T
UHALF_PTR 符号なしHALF_PTR
UINT_PTR 符号なしINT_PTR
ULONG_PTR 符号なしLONG_PTR
Table10 ポインタの精度

内容
_WIN64 64ビットプラットホーム
_WIN32 32ビットプラットホーム(ただし下位互換維持のため
64ビットプラットホームでも宣言されている)
_WIN16 16ビットプラットホーム
Table11 ポインタに関するマクロ

 また、型変換をするためのヘルパー関数が用意されています(Fig.5)。このヘルパー関数は、Basetsd.hに定義されており、これらの関数を用いることで型変換を安全かつ確実に行うことができます。

unsigned long HandleToUlong( const void *h )
long HandleToLong( const void *h )
void *LongToHandle( const long h )
unsigned long PtrToUlong( const void *p )
unsigned int PtrToUint ( const void *p )
unsigned short PtrToUshort ( const void *p )
long PtrToLong( const void *p )
int PtrToInt ( const void *p )
short PtrToShort ( const void *p )
void * IntToPtr ( const int i )
void * UIntToPtr ( const unsigned int ui )
void * LongToPtr ( const long l )
void * ULongToPtr ( const unsigned long ul )
Fig.5 型変換ヘルパー関数一覧

 型変換による警告メッセージもいくつか追加されています(Table12)。これらの警告メッセージは/Wp64コンパイラオプションをつけた場合の警告です。このオプションをオフにすることで警告を消すことができますが、32ビットと64ビットでの互換性を考慮したアプリケーションを作成する場合、通常はオンにしておいたほうがよいでしょう。

エラー番号 警告の意味
C4305 型変換の警告。例えばreturn文でunsigned _int64とするところをlongにしてしまっている
C4311 型変換の警告。例えばタイプキャストでポインタをint *_ptr64からintにしてしまっている
C4312 大きいサイズへの型変換警告。例えばタイプキャストでintからint *_ptr64などの大きなサイズへ変換している
C4318 長さの指定を0にした場合の警告。例えばmemset関数で文字数(size_t)の指定が0になっている
C4319 NOTオペレーション(〜)の警告。例えばunsigned _int64などの大きなサイズにunsigned longを0拡張している
C4313 文字列操作系の警告。 例えばprintfなどで64ビットポインタなどの型のデータを、printf (”%x”, pointer)といった形で表現しようとしている
C4244 C4242と同じ。例えばreturn文で_int64で返すところをunsigned intで返して値の精度を欠落させてしまった
Table12 型変換によるコンパイラ警告(/Wp64+コンパイラ警告レベル3)

Windows API

 64ビットWindows環境でも、大部分のWindows APIはWin32から変更なしで利用することができます。ただし、いくつかのAPIは拡張されたデータ型を使用するために引数の型が変更されました。

 また、64ビット引数を2つの引数に分割するなど、APIそのものが変更されたものもあります。そして、Windowとクラスに関するポリモーフィック(〜Ptr)なAPIも追加されています。

 これらの変更点について、詳しくはMSDN(MSDNの「64ビットWindows API(英語)」の項)を参照していただくとして、ざっとFig.6、7のAPIが変更になります。

Fig.6
Fig.6 変更されるAPIや構造体
Fig.7
Fig.7 ポリモーフィックAPIと使用例

Copyright(C) 2010 SOFTBANK Creative Inc. All Right Reserved.

ページトップに戻る