diff --git a/Docs/src/compiler.but b/Docs/src/compiler.but index ce9422c0..f8dd4934 100644 --- a/Docs/src/compiler.but +++ b/Docs/src/compiler.but @@ -139,6 +139,15 @@ This command creates a temporary file. It puts its path into a define, named \e{ \c !undef FILE \c !undef DATE +\S1{ppgetdllversion} !getdllversion + +\c localfilename define_basename + +This is similar to \R{getdllversionlocal}{GetDLLVersionLocal}, only it stores the version number in defines and can therefore be used anywhere, not just inside functions and sections. + +\c !getdllversion "$%windir%\explorer.exe" expv_ +\c !echo "Explorer.exe version is ${expv_1}.${expv_2}.${expv_3}.${expv_4}" + \S1{warning} !warning \c [message] diff --git a/Docs/src/generalpurpose.but b/Docs/src/generalpurpose.but index 1efd427c..ef52348a 100644 --- a/Docs/src/generalpurpose.but +++ b/Docs/src/generalpurpose.but @@ -66,7 +66,7 @@ Gets the version information from the DLL (or any other executable containing ve \c localfilename user_var(high dword output) user_var(low dword output) -This is similar to \R{getdllversion}{GetDLLVersion}, only it acts on the system building the installer (it actually compiles into two \R{StrCpy}{StrCpy} commands). Sets the two output variables with the DLL version information of the DLL on the build system. +This is similar to \R{getdllversion}{GetDLLVersion}, only it acts on the system building the installer (it actually compiles into two \R{StrCpy}{StrCpy} commands). Sets the two output variables with the DLL version information of the DLL on the build system. Use \R{ppgetdllversion}{!getdllversion} if you need to use the values with \R{viproductversion}{VIProductVersion}. \S2{getfiletime} GetFileTime diff --git a/Source/script.cpp b/Source/script.cpp index cc091498..75b86de0 100644 --- a/Source/script.cpp +++ b/Source/script.cpp @@ -1384,6 +1384,28 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) } return PS_OK; + case TOK_P_GETDLLVERSION: + { + const TCHAR *cmdname = _T("!getdllversion"); + DWORD low, high; + if (!GetDLLVersion(line.gettoken_str(1), high, low)) + { + ERROR_MSG(_T("%s: error reading version info from \"%s\"\n"), cmdname, line.gettoken_str(1)); + return PS_ERROR; + } + TCHAR symbuf[MAX_LINELENGTH], numbuf[30], *basesymname = line.gettoken_str(2); + DWORD vals[] = { high>>16, high&0xffff, low>>16, low&0xffff }; + SCRIPT_MSG(_T("%s: %s (%u.%u.%u.%u)->(%s<1..4>)\n"), + cmdname, line.gettoken_str(1), vals[0], vals[1], vals[2], vals[3], basesymname); + for (UINT i = 0; i < 4; ++i) + { + _stprintf(symbuf,_T("%s%u"), basesymname, i+1); + _stprintf(numbuf,_T("%u"), vals[i]); + definedlist.add(symbuf, numbuf); + } + } + return PS_OK; + // page ordering stuff /////////////////////////////////////////////////////////////////////////////// #ifdef NSIS_CONFIG_VISIBLE_SUPPORT @@ -5062,10 +5084,11 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) return add_entry(&ent); case TOK_GETDLLVERSIONLOCAL: { + const TCHAR*cmdname=_T("GetDLLVersionLocal"); DWORD low, high; if (!GetDLLVersion(line.gettoken_str(1),high,low)) { - ERROR_MSG(_T("GetDLLVersionLocal: error reading version info from \"%s\"\n"),line.gettoken_str(1)); + ERROR_MSG(_T("%s: error reading version info from \"%s\"\n"),cmdname,line.gettoken_str(1)); return PS_ERROR; } ent.which=EW_ASSIGNVAR; @@ -5081,8 +5104,8 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) ent.offsets[2]=0; ent.offsets[3]=0; if (ent.offsets[0]<0) PRINTHELP() - SCRIPT_MSG(_T("GetDLLVersionLocal: %s (%u,%u)->(%s,%s)\n"), - line.gettoken_str(1),high,low,line.gettoken_str(2),line.gettoken_str(3)); + SCRIPT_MSG(_T("%s: %s (%u,%u)->(%s,%s)\n"), + cmdname,line.gettoken_str(1),high,low,line.gettoken_str(2),line.gettoken_str(3)); } return add_entry(&ent); case TOK_GETFILETIMELOCAL: diff --git a/Source/tokens.cpp b/Source/tokens.cpp index 66534a5e..a9101dd4 100644 --- a/Source/tokens.cpp +++ b/Source/tokens.cpp @@ -270,6 +270,7 @@ static tokenType tokenlist[TOK__LAST] = {TOK_P_TEMPFILE,_T("!tempfile"),1,0,_T("symbol"),TP_ALL}, {TOK_P_DELFILE,_T("!delfile"),1,1,_T("[/nonfatal] file"),TP_ALL}, {TOK_P_APPENDFILE,_T("!appendfile"),2,0,_T("file appended_line"),TP_ALL}, +{TOK_P_GETDLLVERSION,_T("!getdllversion"),2,0,_T("localfilename define_basename"),TP_ALL}, {TOK_P_SEARCHPARSESTRING,_T("!searchparse"),3,-1,_T("[/ignorecase] [/noerrors] [/file] source_string substring OUTPUTSYM1 [substring [OUTPUTSYM2 [substring ...]]]"),TP_ALL}, {TOK_P_SEARCHREPLACESTRING,_T("!searchreplace"),4,1,_T("[/ignorecase] output_name source_string substring replacestring"), TP_ALL}, diff --git a/Source/tokens.h b/Source/tokens.h index 2e0638c5..34642460 100644 --- a/Source/tokens.h +++ b/Source/tokens.h @@ -124,6 +124,7 @@ enum TOK_P_TEMPFILE, TOK_P_DELFILE, TOK_P_APPENDFILE, + TOK_P_GETDLLVERSION, TOK_P_SEARCHPARSESTRING, TOK_P_SEARCHREPLACESTRING,