アークピットのホームページに戻る

WinAPIトピックのトップページに戻る

APIトピックの各章に移動する

ダウンロードのページに移動する
ダウンロードができ
ない場合の対処法
 

ページ移動

1-4-5. ファイルに直接保存する変数はサイズに注意

 皆さんがファイルに直接に保存する構造体を作るときは、その使用するメンバ変数に注意しましょう。INIファイルの様に、文字列形式で保存するのなら関係ないのですが、構造体をメモリ上に作成して、それを直接ファイルに保存することは良くあります。
	typedef _tagFILEHEAD {	// fhead
		int nVer;
		char szMark[16];
		long lOffset;
	} FILEHEAD, *FILEHEAD;
 この様な構造体を作りファイルに保存します。
	FILEHEAD fhead;

	_mbscpy(fhead,"Arcpit File");
	fhead.nVer = 2;
	fhead.lOffset = sizeof(FILEHAD);
	WriteFile(hFile,
	WriteFile(hFile,&fhead,sizeof(FILEHEAD),&dwSize,NULL);
 この様なコーディングは問題が無いように思われますが、ファイルは別の環境で読み書きすることが多いこと良くあります。例えばこのファイルをWindows3.1の環境で読むために、上記のソースコードをその環境でリコンパイルします。WIN32のCをWIN16に移すのはいろいろ他の問題がありますが、ここで問題にするのは、int型変数のサイズの違いです。WIN32はintは32ビットですが、WIN16では16ビットですのでファイルを正常に展開できません。
 普通の変数なら16ビットでも32ビットでも、±32765以内の数値しか使わないのなら問題になりません。しかしそれを上記の様に使用すると問題が起こります。1つ2つなら訂正も簡単ですが、多くの構造体があったり、多くの環境に適用するのは大変です。
 それで、変数をサイズの決まった形とそうでないものに分け、ファイルの構造体には形の決まったものだけを使うようにしましょう。

 あと文字コードの問題があります。今までは、シフトJISだけで漢字の問題は無かったのですが、最近はユニコードなどにも配慮する必要が生じてきました。

	TCHAR
 WindowsのWIN32には上記の型宣言があります。しかしこの変数は、95環境とNT環境で違うサイズの型になります。注意してください。

ページ移動