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

拡張子毎に関連付けられたファイルはレジストリからしか取得できません。
コレを取得するAPI関数がAssocQueryStringになるわけですが、
拡張子に関連付けられたファイルはフォルダオプションのopenアクションにある
「アクションを実行するアプリケーション」で見られるように
アプリケーションのパス以外にも%1等のコマンドラインをはじめ、
コマンドラインとアプリケーションパスとの間にダブルクォーテーションが含まれていたり、
JPGで見られるようにEXE以外のDLLファイルパスが入っている場合もあります。
下記のサンプルではダブルクォートを外し、1つ目のコマンド(ファイルパス部)のみを返すようにしてます。
API関数AssocQueryStringに関する情報は少ないのですが、第1パラメータから順に
「フラグ」「返される型」「拡張子」「シェル動詞」「受取先ポインタ」「バッファサイズのポインタ」で、
フラグには下記のASSOCF列挙体が指定できるようですが0でOKかと。(情報が少なくよくわかってません)
ASSOCF_INIT_NOREMAPCLSID0x0001
ASSOCF_INIT_BYEXENAME
ASSOCF_OPEN_BYEXENAME
0x0002
ASSOCF_INIT_DEFAULTTOSTAR0x0004
ASSOCF_INIT_DEFAULTTOFOLDER0x0008
ASSOCF_NOUSERSETTINGS0x0010
ASSOCF_NOTRUNCATE0x0020
ASSOCF_VERIFY0x0040
ASSOCF_REMAPRUNDLL0x0080
ASSOCF_NOFIXUPS0x0100
ASSOCF_IGNOREBASECLASS0x0200
ASSOCF_INIT_IGNOREUNKNOWN0x0400
返される型も下記のASSOCSTR列挙体が指定できますが1でOKかと。(情報が少なくよくわかってません)
ASSOCSTR_COMMAND0x0001
ASSOCSTR_EXECUTABLE0x0002
ASSOCSTR_FRIENDLYDOCNAME0x0003
ASSOCSTR_FRIENDLYAPPNAME0x0004
ASSOCSTR_NOOPEN0x0005
ASSOCSTR_SHELLNEWVALUE0x0006
ASSOCSTR_DDECOMMAND0x0007
ASSOCSTR_DDEIFEXEC0x0008
ASSOCSTR_DDEAPPLICATION0x0009
ASSOCSTR_DDETOPIC0x000A
ASSOCSTR_INFOTIP0x000B
ASSOCSTR_QUICKTIP0x000C
ASSOCSTR_TILEINFO0x000D
ASSOCSTR_CONTENTTYPE0x000E
ASSOCSTR_DEFAULTICON0x000F
ASSOCSTR_SHELLEXTENSION0x0010
ASSOCSTR_DROPTARGET0x0011
ASSOCSTR_DELEGATEEXECUTE0x0012
ASSOCSTR_MAX0x0013
尚、拡張子ではなく、データファイルパスから関連付けファイルを知るにはコチラを参照してください。

relatedexe 格納変数, 拡張子
格納変数関連付けアプリケーションの格納先変数を指定する。
尚、関連付けアプリケーションが見つからなければ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
27
28
29
30
31
32
33
34
35
36
37
	ll_libload shlwapi, "shlwapi.dll"
	ll_getproc AssocQueryString, "AssocQueryStringA", shlwapi

#module
#deffunc relatedexe val, str
	mref exe, 24 : mref ext, 33
	i = 256
	sdim s, i
	prm = 0x0000, 0x0001
	ll_getptr ext : ll_ret prm.2
	cmd = "open" : ll_getptr cmd : ll_ret prm.3
	ll_getptr s : ll_ret prm.4
	ll_getptr i : ll_ret prm.5
	ll_callfunc prm, 6, AssocQueryString@ : ll_ret prm
	if prm = 0 {
		instr i, s, "\""
		if i = 0 {
			instr i, s, "\"", 1
			strmid s, s, 1, i
		}
		instr i.0, s, "."
		instr i.1, s, " ", i
		if i.1 ! -1 : strmid s, s, 0, i + i.1
	}
	exe = s
	return
#global

	sdim path, 256
	extension = ".hsp"
	relatedexe path, extension
	if path ! "" {
		mes "[" + extension + "]は[" + path + "]に関連付けられています"
	} else {
		mes "[" + extension + "]は関連付けられていません"
	}
	stop

アプリケーション = relatedexe(拡張子)
アプリケーション関連付けアプリケーションのパスの受取先を指定する。
尚、関連付けアプリケーションが見つからなければ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
#uselib "shlwapi.dll"
#cfunc global AssocQueryString "AssocQueryStringA" int, int, sptr, sptr, var, var

#module
#defcfunc relatedexe str ext, local i, local s
	i = 256
	sdim s, i
	if AssocQueryString(0x0000, 0x0001, ext, "open", s, i) = 0 {
		if instr(s, 0, "\"") = 0 : s = strmid(s, 1, instr(s, 1, "\""))
		if instr(s, instr(s, , "."), " ") ! -1 {
			s = strmid(s, 0, instr(s, , ".") + instr(s, instr(s, , "."), " "))
		}
	}
	return s
#global

	extension = ".hsp"
	path = relatedexe(extension)
	if path ! "" {
		mes "[" + extension + "]は[" + path + "]に関連付けられています"
	} else {
		mes "[" + extension + "]は関連付けられていません"
	}