verinfex.inc

Переключить прокрутку окна
Загрузить этот исходный код

;
 ;  verinfex – макрос для вставки информации о версии на любом языке.
 ;  Подходит для создания любых исполняемых файлов ОС Windows.
 ;
 ;  Copyright © 2021 Малик Разработчик
 ;
 ;  Это свободная программа: вы можете перераспространять её и/или
 ;  изменять её на условиях Меньшей Стандартной общественной лицензии GNU в том виде,
 ;  в каком она была опубликована Фондом свободного программного обеспечения;
 ;  либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
 ;
 ;  Эта программа распространяется в надежде, что она может быть полезна,
 ;  но БЕЗО ВСЯКИХ ГАРАНТИЙ; даже без неявной гарантии ТОВАРНОГО ВИДА
 ;  или ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЁННЫХ ЦЕЛЕЙ. Подробнее см. в Меньшей Стандартной
 ;  общественной лицензии GNU.
 ;
 ;  Вы должны были получить копию Меньшей Стандартной общественной лицензии GNU
 ;  вместе с этой программой. Если это не так, см.
 ;  <http://www.gnu.org/licenses/>.
;

macro versioninfoex vilabel, fileos, filetype, filesubtype, lang, cp, [namevalue] {
    common
                local   vidata
                local   visize
                local   invalue
                local   insize
                local   version
                local   count
                local   shift
                local   char
                local   filever
                local   prodver
                local   isname
                local   isfilever
                local   isprodver
                local   sfidata
                local   sfisize
                local   strdata
                local   strsize
                local   vsdata
                local   vldata
                local   vfidata
                local   vfisize
                local   vardata
                local   varsize
        vilabel:
                dd      rva vidata, visize, 0, 0
        vidata: dw      visize, insize, 0
                du      "VS_VERSION_INFO", 0, 0
        invalue:
                dd      $feef04bd, 00010000
                filever = 0
                prodver = 0
                isname = 0
    forward
        if(~(namevalue eq))
            if(namevalue eqtype 0)
                        isname = 0
            else if(namevalue eqtype "")
                        isname = isname xor 1
            end if
            if(isname)
                if(namevalue eq "FileVersion")
                            isfilever = 1
                            isprodver = 0
                else if(namevalue eq "ProductVersion")
                            isfilever = 0
                            isprodver = 1
                else
                            isfilever = 0
                            isprodver = 0
                end if
            else
                if(isfilever | isprodver)
                    virtual at 0
                                db      namevalue
                                count = $
                                version = $00
                                shift = $10
                        repeat(count)
                                    load    char from %-1
                            if(char = '.')
                                if(shift mod $20 <> 0)
                                            shift = shift - $10
                                else
                                            shift = shift + $30
                                end if
                            else
                                        version = (version and not($ffff shl shift)) or ((version shr shift and $ffff)*10+char-'0') shl shift
                            end if
                        end repeat
                    end virtual
                    if(isfilever)
                                filever = version
                    end if
                    if(isprodver)
                                prodver = version
                    end if
                end if
                        isfilever = 0
                        isprodver = 0
            end if
        end if
    common
                dq      filever, prodver
                dd      0, 0, fileos, filetype+0, filesubtype+0, 0, 0
                insize = $-invalue
        sfidata:
                dd      sfisize
                du      1, "StringFileInfo", 0
        strdata:
                dd      strsize
                du      1, "040904E4", 0
                count = 0
                isname = 0
    forward
        if(~(namevalue eq))
            if(namevalue eqtype 0)
                        isname = 0
            else if(namevalue eqtype "")
                        isname = isname xor 1
            end if
            if(isname)
                if(count > 0)
                            dw      0
                            store   word $-vsdata at vsdata+$00
                            store   word ($-vldata)/2 at vsdata+$02
                end if
                        align   $04
                        vsdata = $
                        dw      0, 0
                        du      1, namevalue, 0
                        align   $04
                        vldata = $
            else
                if(namevalue eqtype 0)
                            dw      namevalue
                else if(namevalue eqtype "")
                            du      namevalue
                end if
            end if
                    count = 1
        end if
    common
        if(count > 0)
                    dw      0
                    store   word $-vsdata at vsdata+$00
                    store   word ($-vldata)/2 at vsdata+$02
        end if
                align   $04
                strsize = $-strdata
                sfisize = $-sfidata
        vfidata:
                dd      vfisize
                du      1, "VarFileInfo", 0, 0
        vardata:
                dw      varsize, 4
                du      0, "Translation", 0, 0
                dw      lang, cp+0
                varsize = $-vardata
                vfisize = $-vfidata
                visize = $-vidata
}