〜 ファイル 〜
対象ファイルに関連付けられたアプリケーションを取得 (要SHELL32.DLL)

exec命令の第2パラメータにモード16を指定すると関連付けられたアプリケーションで実行されます。
今回紹介するのは、「指定したデータファイルに関連付けられた実行ファイルのパスを取得する」もので、
API関数のFindExecutableを使用しています。
このAPI関数で取得された実行ファイルパスの途中に半角スペースを含んでいると、
文字列終端を示すNULLコードに置き換えられるバグがあると書かれていますが、
試したところ半角スペースを含んでいても問題は再現しませんでした。
環境によって再現する可能性もありますので実際に使う場合には注意が必要です。
「ファイルパスから実行ファイルのパスを取得する」のではなく、
フォルダオプションにあるような「拡張子からファイルのパスを取得する」場合はコチラをご覧ください。
	

findexe 格納変数, 対象ファイル
格納変数関連付けアプリケーションの格納先変数を指定する。
尚、関連付けアプリケーションが見つからなければ0が、見つかれば1がstatに返る。
対象ファイル確認対象データファイルを指定する。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
	ll_libload shell, "shell32.dll"
	ll_getproc FindExecutable, "FindExecutableA", shell

#module
#deffunc findexe val, str
	mref exe, 24 : mref file, 33
	ll_getptr file : ll_ret prm
	ll_getptr exe : ll_ret prm.2
	ll_callfunc prm, 3, FindExecutable@
	return
#global

	sdim f, 512, 2
	mes "関連付けチェック対象ファイルを指定してください"
	dialog "", 16
	if stat {
		f.0 = refstr
		findexe f.1, f.0
		if f.1 ! "" {
			mes "[" + f.0 + "]を実行すると"
			mes "[" + f.1 + "]で開きます"
		} else {
			mes "[" + f.0 + "]は関連付けられていません"
		}
	}
	stop

アプリケーション = findexe(対象ファイル)
アプリケーション関連付けアプリケーションのパスの受取先を指定する。
尚、関連付けアプリケーションが見つからなければ0が、見つかれば1がstatに返る。
対象ファイル確認対象データファイルを指定する。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
#uselib "shell32.dll"
#func  global FindExecutable "FindExecutableA" sptr, sptr, var

#module
#defcfunc findexe str file, local s
	sdim s, 1024
	FindExecutable file, "", s
	return s
#global

	mes "関連付けチェック対象ファイルを指定してください"
	dialog "", 16
	if stat {
		f = refstr
		if findexe(f) ! "" {
			mes "[" + f + "]を実行すると"
			mes "[" + findexe(f) + "]で開きます"
		} else {
			mes "[" + f + "]は関連付けられていません"
		}
	}