;hsp3.21 ;chngicon.as アイコンの書き換え ;Tomさんのiconrewr.dllのソースを参考にしています #module #deffunc longpeek var p0, var p1, int p2_ p2=p2_ ;mref p0,16: ;mref p1,25: ;mref p2,2 p0=wpeek(p1,p2): c=wpeek(p1,p2+2): p0=c<<16|p0 return #deffunc longpoke var var, int pnt_, int value_ pnt=pnt_ value=value_ ;mref var,24: ;mref pnt,1: ;mref value,2 wpoke var,pnt,value&$ffff wpoke var,pnt+2,value>>16 return #deffunc setIRD var var, int pnt_, int nname_, int nid_ pnt=pnt_ nname=nname_ nid=nid_ ;mref var,24: ;mref pnt,1: ;mref nname,2: ;mref nid,3 wpoke var,pnt+12,nname ;NumberOfNamedEntry wpoke var,pnt+14,nid ;NumberOfIdEntry return #deffunc setIRDE var var, int pnt_, int offset_, int namestr_, int ird_pos_, int datdir_ pnt=pnt_ offset=offset_ namestr=namestr_ ird_pos=ird_pos_ datdir=datdir_ ;mref var,24: ;mref pnt,1 ;mref offset,2: ;mref namestr,3: ;mref ird_pos,4: ;mref datdir,5 longpoke var,pnt,namestr<<31|offset longpoke var,pnt+4,datdir<<31|ird_pos return #global #define MAX_PATH 260 sdim icofile,MAX_PATH+1 sdim exefile,MAX_PATH+1 sdim s,MAX_PATH+1 dialog "ico",16,"アイコンファイル": if stat==0 { end } icofile=refstr dialog "exe",16,"書き換えるファイル": if stat==0 { end } exefile=refstr ;アイコンファイル exist icofile: icolen=strsize: if icolen<0 { dialog icofile+"がありません": end } sdim icobuf,icolen bload icofile,icobuf c=wpeek(icobuf,0): d=wpeek(icobuf,2): num=wpeek(icobuf,4) if (c!=0)|(d!=1)|(num<1) { dialog icofile+"はアイコンファイルではありません": end } ressize=0: p=6: dim asize,num repeat num longpeek asize.cnt,icobuf,p+8: ressize+=asize.cnt p+=16 loop if num*16+ressize+6!=icolen { dialog icofile+"は壊れています": end } ;exeファイル exist exefile: exelen=strsize: if exelen<0 { dialog exefile+"がありません": end } sdim exebuf,exelen bload exefile,exebuf c=peek(exebuf,0): d=peek(exebuf,1) if (c!='M')|(d!='Z') { dialog exefile+"は実行ファイルではありません": end } pinth=wpeek(exebuf,60) c=peek(exebuf,pinth): d=peek(exebuf,pinth+1): e=wpeek(exebuf,pinth+2) if (c!='P')|(d!='E')|(e!=0) { dialog exefile+"のファイルフォーマットには対応していません": end } longpeek c,exebuf,pinth+140: if c<1 { dialog "リソースセクションがありません": end } longpeek vad,exebuf,pinth+136: nsec=wpeek(exebuf,pinth+6) p=pinth+248: i=-1 repeat nsec longpeek c,exebuf,p+12: if c==vad { i=cnt: break } p+=40 loop: if i<0 { dialog "Not found ImageSectionHeader.": end } pish=p ;ImageSectionHeader longpeek ressecsize,exebuf,p+16 if ressecsizeMAX_ICON_NAME { dialog "MAX_ICON_NAMEが足りません。必要サイズ="+leniconame end } i=0 repeat leniconame/2 c=wpeek(exebuf,p): p++: p++ wpoke giname,i,c: i++: i++ loop } } needsize=num*48+112 hdrnamesize=(needsize+leniconame+17)/16*16 ;(……+2+15)/16*16 newRSSize=hdrnamesize+ressize+6+(num*16) ;if ressecsize0 { repeat leniconame: c=peek(giname,cnt): poke exebuf,p,c: p++: loop } if p-prsa0 { repeat c: poke exebuf,p,0: p++: loop } longpoke exebuf,pinth+140,newRSSize longpoke exebuf,pish+8,newRSSize bsave exefile,exebuf,exelen end