EXEなどの実行ファイルのバージョン情報(リソース)を書き換えるモジュールです。http://d.hatena.ne.jp/espresso3389/20100907 を参考にしました。
EXEなどの実行ファイルのバージョン情報(リソース)を書き換えるモジュールです。http://d.hatena.ne.jp/espresso3389/20100907 を参考にしました。
// http://d.hatena.ne.jp/espresso3389/20100907 参考にしました#include "kernel32.as"#ifndef __VERSIONINFOBUILDER__#define __VERSIONINFOBUILDER__#module VersionInfoBuilder _langID, _fileVer, _prodVer, _props_name, _props_val, CODEPAGE_UCS2LE, _buffer, _buffer_maxsize, _buffer_current#modinit int langIDif langID == 0 : _langID = 0x0411 : else : _langID = langIDdim _fileVer, 4dim _prodVer, 4sdim _props_name : sdim _props_valCODEPAGE_UCS2LE = 0x4b0return#modfunc dumpBuffer var dumpsdim dump, _buffer_current+1memcpy dump, _buffer, _buffer_current, 0, 0return _buffer_current#modfunc setPropVal str name, str valnotesel _props_namenoteadd namenotesel _props_valnoteadd valreturn#modfunc setFileVersion int a, int b, int c, int d_fileVer.0 = a_fileVer.1 = b_fileVer.2 = c_fileVer.3 = dreturn#modfunc setProdVersion int a, int b, int c, int d_prodVer.0 = a_prodVer.1 = b_prodVer.2 = c_prodVer.3 = dreturn#modfunc buildbuildVerInfo thismodreturn#modfunc updateExeFile str fileNamebuild thismod_fileName = fileNameBeginUpdateResource varptr(_fileName), 0/*FALSE*/hResource = statif stat == 0 : return -1UpdateResource hResource, 16/*RT_VERSION*/, 1/*VS_VERSION_INFO */, _langID, varptr(_buffer), _buffer_currentres = statEndUpdateResource hResource, 0/*FALSE*/return stat#modfunc clearsize = 100000 + strlen(_props_name)*2 + strlen(_props_val)*2sdim _buffer, size_buffer_maxsize = size_buffer_current = 0return#modfunc writeWord int ptr, int wpoke _buffer, ptr, w & 255poke _buffer, ptr + 1, w >> 8return#modcfunc pushWord int wpoke _buffer, _buffer_current, w & 255 : _buffer_current++poke _buffer, _buffer_current, w >> 8 : _buffer_current++return _buffer_current - 2#modcfunc pushByte4 int a, int b, int c, int dpoke _buffer, _buffer_current, a : _buffer_current++poke _buffer, _buffer_current, b : _buffer_current++poke _buffer, _buffer_current, c : _buffer_current++poke _buffer, _buffer_current, d : _buffer_current++return _buffer_current - 4#modfunc align4_pos = _buffer_current & 3if _pos == 0 : returnpadLen = 4 - _posrepeat padLenpoke _buffer, _buffer_current, 0 : _buffer_current++loopreturn#modcfunc pushStr str _str_pos = getPtr(thismod)// unicodeに変換sdim unistr, strlen(_str)*2+2cnvstow unistr, _strrepeat_w = wpeek(unistr, cnt*2)dummy = pushWord(thismod, _w)if _w == 0 : breakloopalign4 thismodreturn _pos#modcfunc getPtrreturn _buffer_current#modfunc writeLength int ptrwriteWord thismod, ptr, getPtr(thismod) - ptr - 2return#modcfunc verStr array vreturn strf("%u, %u, %u, %u", v(0), v(1), v(2), v(3))#modfunc buildVerInfosetPropVal thismod, "FileVersion", verStr(thismod, _fileVer)setPropVal thismod,"ProductVersion", verStr(thismod, _prodVer)clear thismod // buffer初期化ptrWholeSize = pushWord(thismod, 0) // whole size (dummy)dummy = pushWord(thismod, 0x34)dummy = pushWord(thismod, 0x00)dummy = pushStr(thismod, "VS_VERSION_INFO")dummy = pushByte4(thismod, 0xbd, 0x04, 0xef, 0xfe) // Signature BD04EFFEdummy = pushByte4(thismod, 0, 0, 1, 0) // struct versiondummy = pushWord(thismod, _fileVer(1))dummy = pushWord(thismod, _fileVer(0))dummy = pushWord(thismod, _fileVer(3))dummy = pushWord(thismod, _fileVer(2))dummy = pushWord(thismod, _prodVer(1))dummy = pushWord(thismod, _prodVer(0))dummy = pushWord(thismod, _prodVer(3))dummy = pushWord(thismod, _prodVer(2))dummy = pushByte4(thismod, 0x17, 0, 0, 0) // file flags mask (0x17)dummy = pushByte4(thismod, 0, 0, 0, 0) // file flags (0)dummy = pushByte4(thismod, 4, 0, 0, 0) // OS: 32-bit Windows (even on x64)dummy = pushByte4(thismod, 1, 0, 0, 0) // file type: App(1)dummy = pushByte4(thismod, 0, 0, 0, 0) // sub-file type: Unknown(0)dummy = pushByte4(thismod, 0, 0, 0, 0)dummy = pushByte4(thismod, 0, 0, 0, 0)ptrStrFileInfoSize = pushWord(thismod, 0)dummy = pushByte4(thismod, 0, 0, 1, 0)dummy = pushStr(thismod, "StringFileInfo")ptrStrTable = pushWord(thismod, 0)dummy = pushByte4(thismod, 0, 0, 1, 0)loc = strf("%04x%04x", _langID, CODEPAGE_UCS2LE)dummy = pushStr(thismod, loc)notesel _props_namerepeat notemaxnotesel _props_namenoteget first, cntnotesel _props_valnoteget second, cntptr = pushWord(thismod, 0)ptrValLen = pushWord(thismod, 0)dummy = pushWord(thismod, 1)dummy = pushStr(thismod, first)ptrVal = getPtr(thismod)dummy = pushStr(thismod, second)vsize = getPtr(thismod) - ptrValwriteWord thismod, ptrValLen, vsize / 2writeLength thismod, ptrloopwriteLength thismod, ptrStrTablewriteLength thismod, ptrStrFileInfoSizedummy = pushWord(thismod, 0x44)dummy = pushWord(thismod, 0)dummy = pushWord(thismod, 1)dummy = pushStr(thismod, "VarFileInfo")dummy = pushWord(thismod, 0x24)dummy = pushWord(thismod, 4)dummy = pushWord(thismod, 0)dummy = pushStr(thismod, "Translation")dummy = pushWord(thismod, _langID)dummy = pushWord(thismod, CODEPAGE_UCS2LE)dummy = pushWord(thismod, 0x613c) // ???writeLength thismod, ptrWholeSizereturn#global#endif// 以下サンプルnewmod vib, VersionInfoBuilder, 0x411 // 日本 // 米国なら 0x409// プロパティを設定していくsetPropVal vib, "Comments", "Comments!!!"setPropVal vib, "CompanyName", "CompanyName!!!"setPropVal vib, "FileDescription", "FileDescription!!!"setPropVal vib, "InternalName", "InternalName!!!"setPropVal vib, "LegalCopyright", "LegalCopyright!!!"setPropVal vib, "LegalTrademarks", "LegalTrademarks!!!"setPropVal vib, "OriginalFilename", "OriginalFilename!!!"setPropVal vib, "PrivateBuild", "PrivateBuild!!!"setPropVal vib, "ProductName", "ProductName!!!"setPropVal vib, "SpecialBuild", "SpecialBuild!!!"// バージョンの設定setFileVersion vib, 1, 2, 3, 4setProdVersion vib, 5, 6, 7, 8dialog "exe",16if stat == 0 : endsdim fname, 1024fname = refstr// 実行ファイルに書き込みupdateExeFile vib, fname// 作成されたデータをダンプする場合;dumpBuffer vib, dumpdelmod vib