プログラミング工房 > HSP > サンプルスクリプト > 実行ファイルのサブシステムを調べる >

/***********************************************************

	実行ファイルがGUI(Windows)アプリかCUI(コマンドライン)
	アプリか判定

		【2005/12/03 更新】

***********************************************************/

#packopt hide 1

/*
	実行ファイルの種類
	(http://www.interq.or.jp/chubu/r6/reasm/PE_FORMAT/3_4_2.html参照)
*/
#const SUBSYSTEM_UNKNOWN	0	// 未知のサブシステム 
#const SUBSYSTEM_NATIVE		1	// デバイスドライバおよびWindows NTネイティブのプロセス
#const SUBSYSTEM_WIN_GUI	2   // Windows GUIサブシステム内で実行されるイメージ
#const SUBSYSTEM_WIN_CUI	3   // Windows CUIサブシステム内で実行されるイメージ
#const SUBSYSTEM_POSIX_CUI	7   // Posix CUIサブシステム内で実行されるイメージ
#const SUBSYSTEM_WIN_CE_GUI	9   // Windows CE上で実行されるイメージ

/* PEシグネチャへのオフセットの格納位置 */
#const PESIG_OFFSET_POS     60
/* PEシグネチャから実行ファイルの種類を示すデータまでのオフセット */
#const SUBSYS_TYPE_OFFSET   92

	/* 実行ファイル選択 */
	dialog "exe",16,"実行ファイル"
	if stat {
		path = refstr
		dialog "\""+path+"\"のサブシステムを判定します。"
	}
	else {
		end
	}

	/* 実行ファイル読み込み */
	exist path
	size = strsize
	sdim buf,size+1
	bload path,buf,size,0

	/* ファイル先頭からのPEシグネチャへのオフセット */
	offset = lpeek(buf,PESIG_OFFSET_POS)

	/* サブシステムの種類を取得 */
	type = wpeek(buf,offset+SUBSYS_TYPE_OFFSET)
	
	switch type
	case SUBSYSTEM_WIN_GUI
		dialog "サブシステムは「Windows GUI」です。",,"判定結果"
		swbreak
	case SUBSYSTEM_WIN_CUI
		dialog "サブシステムは「Windows CUI」です。",,"判定結果"
		swbreak
	default
		dialog "サブシステムは「その他」です。",,"判定結果"
	swend

	end