パスが変数に代入されるように勝手に改造w
icondlg の3番目の引数に変数を指定すると、選択したアイコンのパスが返ります。
#module
;▼必要となるAPIや定数の定義
#uselib "kernel32.dll"
#cfunc LoadLibrary "LoadLibraryA" var
#func GetProcAddress "GetProcAddress" int,int
#func GetVersionEx "GetVersionExA" var
#func MultiByteToWideChar "MultiByteToWideChar" int,int,int,int,int,int
#func WideCharToMultiByte "WideCharToMultiByte" int,int,int,int,int,int,int,int
#func FreeLibrary "FreeLibrary" int
#deffunc icondlg var prm1,str prm2,var prm3
ls=strlen(prm2) : sdim sFile,ls+2
sFile = prm2 : if ls==0 : return -1
exist sFile : if strsize=-1 : return -1
;SHChangeIconDialog関数のアドレスを取得
dll="shell32.dll"
pdll=LoadLibrary(dll) : if pdll==0 : return -1
GetProcAddress pdll,62
_SHChangeIconDialog=stat
if _SHChangeIconDialog==0 : return -1
;OSVERSIONINFO構造体
dim osverinfo,148 : osverinfo(0)=148
GetVersionEx osverinfo
if osverinfo(4)==2 : OsVerNT=1 : else : OsVerNT=0
;NT系の場合 (sFileをUniCodeに変換)
#define CP_ACP $00000000
if OsVerNT==1 {
ls=(strlen(sFile)+1)*2 : sdim mb,ls
MultiByteToWideChar CP_ACP,0,varptr(sFile),-1,varptr(mb),ls
prm=hwnd,varptr(mb),260,varptr(idx)
ret=callfunc (prm,_SHChangeIconDialog,4)
prm3=cnvwtos(mb)
if ret==0 : ret=-1
prm1=idx
WideCharToMultiByte CP_ACP,0,varptr(sFile),-1,varptr(mb),0,0,0
sdim mb,0
FreeLibrary pdll
dim osverinfo,0 : sdim sFile,0
return ret
}
;9X系の場合
prm=hwnd,varptr(sFile),0,varptr(idx)
ret=callfunc (prm,_SHChangeIconDialog,4)
prm3=mb
if ret==0 : ret=-1
prm1=idx
FreeLibrary pdll
dim osverinfo,0 : sdim sFile,0
return ret
#global
;***** sample *****
filename=dirinfo(3)+"\\shell32.dll"
icondlg nIndex,filename,refpath
if stat=-1 : stop
mes "Index:"+nIndex
mes refpath
stop