WindowsAPIのデータ型

Windowsプログラム

Windows プログラムでは,long や unsigned int といった型名の代わりに,LONG や UINT といった独自の型名が多く使われます。これらは主に, typedef で定義されたものです。

typedef long LONG;
typedef unsigned int UINT;

型の別名はwindef.h や winnt.hで定義されています。

基本的なデータ型

Win32が定義する主なデータ型

Win32における別名C++のデータ型解説
UCHAR, BYTE unsigned char 8ビットの符号なし整数
USHORT, WORD unsigned short 16ビットの符号なし整数
LONGlong32ビットの符号付き整数
DWORD unsigned long 32ビットの符号なし整数
LONGLONG64ビットの符号付き整数
ULONGLONG64ビットの符号なし整数
CHAR char
WCHAR wchar_t wchar_t 型は 符号なし16ビット ※
SHORT short int
USHORT, WORD unsigned short int
INT signed int
UINT unsigned int
FLOAT float
DOUBLEdouble
VOID void

※ wchar_t型は、日本語のようにひらがな・カタカナ・漢字など多くの文字があって1バイトでは表現できない言語を表すときに1文字を2バイトで表すワイド文字のこと。1バイト以上の文字のことをマルチバイト文字と呼ぶ。

主なポインター型

型の識別子の先頭にLPやPという接頭辞を指定するとポインタ型になるという規則がある。例えば、DWORD型へのポインタはPDWORD型となる。PDWORD型は「DWORD * 」と同じ意味となります。

Win32における別名 C++のデータ型
PUCHAR, PBYTE, LPBYTE unsigned char *
PSHORT short *
PUSHORT, PWORD, LPWORD unsigned short *
PINT, LPINT int *
PUINT unsigned int *
PLONG long *
PULONG, PDWORD, LPDWORD unsigned long *
PFLOAT float *
PVOID, LPVOID void *
LPCVOID const void *

LPとPの接頭辞に違いはない。「LPDWORD」、「PDWORD」、「DWORD *」は同じ型を表している。PはPointerの頭文字、LはLongの頭文字を表している。LPはLong Pointerのことを表しているが、これは16ビットWindows時代の名残。

文字列型

constを表すときは間に「C」が入る。例えば、「 char * 」は「 LPSTR 」となり「 const char * 」は「 LPCSTR 」となる。

Win32における別名 C++のデータ型
PCHAR, LPCH, PCH, NPSTR, LPSTR, PSTRchar *
LPCCH, PCCH, LPCSTR, PCSTR const char *
PWCHAR, LPWCH, PWCH, NWPSTR, LPWSTR, PWSTR wchar_t *
LPCWCH, PCWCH, LPCWSTR, PCWSTR const wchar_t *
PTCHAR, LPTCH, PTCH, PTSTR, LPTSTR TCHAR *
LPCTCH, PCTCH, PCTSTR, LPCTSTR const TCHAR *

TCHARとは

TCHARの定義を見てみると、下記のようになっている。

#ifdef UNICODE
	typedef WCHAR    TCHAR;
#else
	typedef char     TCHAR;
#endif

UNICODEが定義されていれば「WCHAR」、定義されていなければ「char」ということ。UNICODEの定義は、 VisualStudioの「プロジェクト」を右クリックし、「プロパティ」からプロジェクトの設定画面を開き、「構成プロパティ」>「全般」の中にある 「文字セット」を「マルチバイト文字セットを使用する」と「 Unicode 文字セットを使用する 」で切り替えられる。

TEXT()とは

UNICODE設定とマルチバイト設定の差異を解消するためのマクロ。

  • L”文字列” 
  • TEXT(”文字列”)
  • _T(”文字列”)

L”文字列”は、UNICODE限定の文字列という意味。_T() とTEXT()は、どちらも同じ動きをするマクロで、UNICODEが定義されていればL”文字列”、定義されていなければ”文字列”としてくれる。

_T() は tchar.h 、TEXT()は winnt.h の中にあり、定義してあるヘッダファイルが違うだけで、どちらも同じように使うことができる。

論理型 BOOL および BOOLEAN 

BOOLとBOOEANは次のように定義

typedef int   BOOL;
typedef BYTE  BOOLEAN;

TRUE と FALSE

TRUEとFALSEは次のように定義

#define FALSE 0
#define TRUE  1
タイトルとURLをコピーしました