HSPエラー13 「画像ファイルがありません」

フリーのプログラミングツール「HSP」のエラーメッセージ『HSP Error』。
 画像ファイルを読み込んで表示するpicload命令の部分で起こるエラーです。HSPエラーの番号は「13」となっとります。エディタ上のコンパイル実行では『画像ファイルがありません』のメッセージ。実行ファイルでのエラーメッセージは『内部エラーが発生しました(13)』。

考えられるエラーの原因

1. 画像ファイルがそもそも存在しない

たとえば、実行ファイルと同じフォルダにある画像ファイルを読み込む、あるいはPACKFILE内にある画像ファイルを読み込む場合は、下のようなコードになるでしょうか。
 当然ながら、この「hoge.bmp」が存在してない場合にHSPエラーとなります。

	picload "hoge.bmp"

PACKFILE内に必ず存在するなら不要ですが、外部に画像ファイルが存在するならば、プログラムが強制終了しないようファイルの存在をチェックするexist命令を使います。ファイルがない場合は、システム変数strsizeに-1が返ってくるのを利用するワケ。

	exist "hoge.bmp"
	if strsize = -1 {
		dialog "hoge.bmp が見つからない。", 1, "エラー"
		stop
	}

	picload "hoge.bmp"

2. ファイルパスの指定をミスってる

画像ファイルをサブフォルダに用意してる場合に起こりうるミスです。
 たとえば、実行ファイル下層の「image」フォルダに画像ファイル「hoge.bmp」があるとすると、下のように書いちゃう人がときどき現れます。(−−;

;	× ダメ
	picload "image\hoge.bmp"

HSP(HSP3)に付属してるHTMLリファレンス『プログラミングマニュアル1・基本仕様ガイド (hspprog.htm)』の「2.スクリプト記述の基本」→「文字列」の項目に書かれてあるように、スクリプト上の「\」(円記号)は特殊なキャラクタ文字なので、「\\」と書くことで初めてフォルダ(ディレクトリ)の区切りと認識されます。(区切りはスラッシュ「/」でもOK)
 これはファイルの入出力に関連するnoteload命令、bload命令、bcopy命令、deleate命令、dirlsit命令なんかでも同じです。

;	○ オーケー
	picload "image\\hoge.bmp"
;	○ オーケー
	picload "image/hoge.bmp"

また、画像ファイルの拡張子は必ず指定しましょう。
 たとえば、下のようなコードだと「hoge」という拡張子のないファイルを読み込もうとしてることになります。

;	× ダメ
	picload "image\\hoge"

ちょっと話がずれますが、デフォルトのWindowsの設定では拡張子を表示しないファイルがあるので、アイコン書き換えページの「拡張子」というところの説明を参照してください。セキュリティ面から見ても拡張子表示は重要です。

3. ファイルパスが長すぎる (階層が深すぎる)

Windowsの仕様でファイルパスの長さには260バイトの制限(MAX_PATH)があります。 あまりに深い階層にある画像ファイルのパスを指定するとエラーになります。

4. カレントフォルダが移動してる

カレントフォルダのカレント(current)は「現在の」という意味です。

たとえば、下のようなコードだと「C:\hoge.bmp」の画像ファイルを読み込みにいってることになります。

	chdir "C:\\"
	mes dirinfo(0)

	picload "hoge.bmp"

実行ファイルと同じ場所の画像ファイル「hoge.bmp」を読み込みたいのであれば、dirinfo関数(タイプ1)orシステム変数「dir_exe」に自分自身の実行ファイルがあるフォルダパスが入ってるので、これを反映させます(絶対パス)。画像ファイルがちゃんと存在してる限り、確実にファイルが読み込めます。

	chdir "C:\\"

//	カレントフォルダを実行ファイルのあるフォルダに移動
	chdir dirinfo(0)
	picload "hoge.bmp"
	chdir "C:\\"

//	実行ファイルのあるフォルダのパス+「\\」+画像ファイル の直指定
	picload dirinfo(0) + "\\hoge.bmp"

5. PACKFILE機能で画像ファイルの名前が長すぎる

実行ファイルに任意のファイルを埋め込めるPACKFILE機能は、指定できる ファイル名に制限があります。
 HSPリファレンスから引用すると、『ここで指定するファイル名はスペースを含まない半角で11文字以内のMS-DOS ファイルネームでなければなりません。』とあり、長いファイル名や日本語ファイル名はダメです。(正確には拡張子 も含めたファイル名は15バイト以下である必要がある)

あくまで、これはPACKFILE機能での制限なので、スクリプトエディタ上でのコンパイル実行では問題なくても、 実行ファイルを起動した段階ではエラー13になります。

6. 対応してない画像ファイル、壊れてる画像ファイル

HSP3(HSP 3.x)のpicload命令の対応フォーマットは、BMPファイル、GIFファイル、JPEGファイル、ICOファイル、CURファイルといったところです。
 たとえば、対応してないPNGファイルやMAGファイルなんかを指定したらHSPエラーです。

また、対応してる画像ファイルであったとしてもファイル内部が壊れていて読み込めない場合、このエラーになる場合があります。極端な話、テキストファイル「readme.txt」を「readme.bmp」というように拡張子変更すると、アイコン自体はBMPファイルのものに変わりますが、中身はテキストファイルなの読み込めずにエラーとなります。

キーワード de HSP

HSPミニ講座

★ Yahoo!経由用ページ : ファイル | フォルダ | メニュー | マウス | ウィンドウ | オブジェクト | 文字列 | システム | 関数 | sendmsg命令 | その他 | サイトマップ | リンク