From 4e4b0e84204e63c0df550d8b944cf470dc291680 Mon Sep 17 00:00:00 2001 From: joostverburg Date: Fri, 6 Aug 2004 22:04:13 +0000 Subject: [PATCH] new system for DLL/TLB library setup git-svn-id: https://svn.code.sf.net/p/nsis/code/NSIS/trunk@3601 212acab6-be3b-0410-9dea-997c60f758d6 --- Contrib/Library/LibraryLocal/LibraryLocal.cpp | 213 +++++++ Contrib/Library/LibraryLocal/LibraryLocal.dsp | 109 ++++ Contrib/Library/LibraryLocal/LibraryLocal.dsw | 29 + Contrib/Library/LibraryLocal/LibraryLocal.exe | Bin 0 -> 94208 bytes Contrib/Library/RegTool/RegTool.bin | Bin 0 -> 23509 bytes Contrib/Library/RegTool/RegTool.nsi | 137 ++++ Contrib/Library/TypeLib/TypeLib.cpp | 123 ++++ Contrib/Library/TypeLib/TypeLib.dsp | 109 ++++ Contrib/Library/TypeLib/TypeLib.dsw | 29 + Include/Library.nsh | 590 ++++++++++++++++++ Include/UpgradeDLL.nsh | 102 +-- Plugins/TypeLib.dll | Bin 0 -> 4608 bytes 12 files changed, 1396 insertions(+), 45 deletions(-) create mode 100644 Contrib/Library/LibraryLocal/LibraryLocal.cpp create mode 100644 Contrib/Library/LibraryLocal/LibraryLocal.dsp create mode 100644 Contrib/Library/LibraryLocal/LibraryLocal.dsw create mode 100644 Contrib/Library/LibraryLocal/LibraryLocal.exe create mode 100644 Contrib/Library/RegTool/RegTool.bin create mode 100644 Contrib/Library/RegTool/RegTool.nsi create mode 100644 Contrib/Library/TypeLib/TypeLib.cpp create mode 100644 Contrib/Library/TypeLib/TypeLib.dsp create mode 100644 Contrib/Library/TypeLib/TypeLib.dsw create mode 100644 Include/Library.nsh create mode 100644 Plugins/TypeLib.dll diff --git a/Contrib/Library/LibraryLocal/LibraryLocal.cpp b/Contrib/Library/LibraryLocal/LibraryLocal.cpp new file mode 100644 index 00000000..52047fc5 --- /dev/null +++ b/Contrib/Library/LibraryLocal/LibraryLocal.cpp @@ -0,0 +1,213 @@ +/* + + LibraryLocal - used by the Library.nsh macros + Get the version of local DLL and TLB files + Written by Joost Verburg + +*/ + +#include +#include +#include +#include + +using namespace std; + +int APIENTRY WinMain(HINSTANCE hInstance, + HINSTANCE hPrevInstance, + LPSTR lpCmdLine, + int nCmdShow) +{ + + // Parse the command line + + string cmdline; + cmdline = lpCmdLine; + + string mode; + string filename; + string filepath; + + int filefound = 0; + + if (cmdline.length() >= 3) + { + + // Get the full path of the local file + + mode = cmdline.substr(0, 1); + filename = cmdline.substr(2); + + char buf[MAX_PATH]; + GetCurrentDirectory(MAX_PATH, buf); + filepath = buf; + + if ((filename.substr(0, 1).compare("\\") != 0) && (filename.substr(1, 1).compare(":") != 0)) { + + // Path is relative + + if (filepath.substr(filepath.length() - 1, 1).compare("\\") != 0) + filepath.append("\\"); + + filepath.append(filename); + + } else if (filename.substr(0, 1).compare("\\") == 0) { + + // Path is relative to current root + + if (filepath.substr(1, 1).compare(":") == 0) { + + // Standard path + + filepath = filepath.substr(0, filepath.find('\\')); + filepath.append(filename); + + } else { + + // UNC path + + filepath = filepath.substr(0, filepath.find('\\', filepath.find('\\', 2) + 1)); + filepath.append(filename); + + } + + } else { + + // Absolute path + + filepath = filename; + + } + + // Validate filename + + WIN32_FIND_DATA wfd; + HANDLE hFind = FindFirstFile(filepath.c_str(), &wfd); + + if (hFind != INVALID_HANDLE_VALUE) + { + filefound = 1; + FindClose(hFind); + } + + } + + int versionfound = 0; + DWORD low = 0, high = 0; + + if (filefound) + { + + // Get version + + // DLL + + if (mode.compare("D") == 0) + { + + DWORD versionsize; + DWORD temp; + + versionsize = GetFileVersionInfoSize(filepath.c_str(), &temp); + + if (versionsize) + { + + void *buf; + buf = (void *)GlobalAlloc(GPTR, versionsize); + + if (buf) + { + + UINT uLen; + VS_FIXEDFILEINFO *pvsf; + + if (GetFileVersionInfo(filepath.c_str(), 0, versionsize, buf) && VerQueryValue(buf, "\\", (void**)&pvsf,&uLen)) + { + high = pvsf->dwFileVersionMS; + low = pvsf->dwFileVersionLS; + + versionfound = 1; + } + + GlobalFree(buf); + + } + + } + + } + + // TLB + + if (mode.compare("T") == 0) + { + + wchar_t ole_filename[1024]; + MultiByteToWideChar(CP_ACP, 0, filepath.c_str(), filepath.length() + 1, ole_filename, 1024); + + ITypeLib* typeLib; + HRESULT hr; + + hr = LoadTypeLib(ole_filename, &typeLib); + + if (SUCCEEDED(hr)) { + + TLIBATTR* typelibAttr; + + hr = typeLib->GetLibAttr(&typelibAttr); + + if (SUCCEEDED(hr)) { + + high = typelibAttr->wMajorVerNum; + low = typelibAttr->wMinorVerNum; + + versionfound = 1; + + } + + typeLib->Release(); + + } + + } + + } + + // Write the version to an NSIS header file + + char appfile[MAX_PATH]; + GetModuleFileName(0, appfile, MAX_PATH); + + string headerfile; + headerfile = appfile; + headerfile = headerfile.substr(0, headerfile.rfind('\\')); + headerfile.append("\\LibraryLocal.nsh"); + + ofstream header(headerfile.c_str(), ofstream::out); + + if (header) + { + + if (!filefound) + { + + header << "!define LIBRARY_VERSION_FILENOTFOUND" << endl; + } + else if (!versionfound) + { + header << "!define LIBRARY_VERSION_NONE" << endl; + } + else + { + header << "!define LIBRARY_VERSION_HIGH " << high << endl; + header << "!define LIBRARY_VERSION_LOW " << low << endl; + } + + header.close(); + + } + + return 0; + +} diff --git a/Contrib/Library/LibraryLocal/LibraryLocal.dsp b/Contrib/Library/LibraryLocal/LibraryLocal.dsp new file mode 100644 index 00000000..7410a199 --- /dev/null +++ b/Contrib/Library/LibraryLocal/LibraryLocal.dsp @@ -0,0 +1,109 @@ +# Microsoft Developer Studio Project File - Name="LibraryLocal" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Application" 0x0101 + +CFG=LibraryLocal - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "LibraryLocal.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "LibraryLocal.mak" CFG="LibraryLocal - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "LibraryLocal - Win32 Release" (based on "Win32 (x86) Application") +!MESSAGE "LibraryLocal - Win32 Debug" (based on "Win32 (x86) Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "LibraryLocal - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /c +# ADD CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x413 /d "NDEBUG" +# ADD RSC /l 0x413 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib version.lib /nologo /subsystem:windows /machine:I386 /out:"LibraryLocal.exe" +# SUBTRACT LINK32 /pdb:none + +!ELSEIF "$(CFG)" == "LibraryLocal - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /GZ /c +# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /GZ /c +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x413 /d "_DEBUG" +# ADD RSC /l 0x413 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib version.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept +# SUBTRACT LINK32 /pdb:none + +!ENDIF + +# Begin Target + +# Name "LibraryLocal - Win32 Release" +# Name "LibraryLocal - Win32 Debug" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=.\LibraryLocal.cpp +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# End Group +# Begin Group "Resource Files" + +# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" +# End Group +# End Target +# End Project diff --git a/Contrib/Library/LibraryLocal/LibraryLocal.dsw b/Contrib/Library/LibraryLocal/LibraryLocal.dsw new file mode 100644 index 00000000..b33b2887 --- /dev/null +++ b/Contrib/Library/LibraryLocal/LibraryLocal.dsw @@ -0,0 +1,29 @@ +Microsoft Developer Studio Workspace File, Format Version 6.00 +# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! + +############################################################################### + +Project: "LibraryLocal"=".\LibraryLocal.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Global: + +Package=<5> +{{{ +}}} + +Package=<3> +{{{ +}}} + +############################################################################### + diff --git a/Contrib/Library/LibraryLocal/LibraryLocal.exe b/Contrib/Library/LibraryLocal/LibraryLocal.exe new file mode 100644 index 0000000000000000000000000000000000000000..343815c496b05382fab948d1a691bf5cea5769b2 GIT binary patch literal 94208 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

!vj_k?LYSnVe%;6NJ%)FIiaCotFFbzr!6Rc-` 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 f;VzqQ>+`73v{S2BoMHR)Q=D2gs +#include "../../exdll/exdll.h" + +#define NSISFunction(funcname) extern "C" void __declspec(dllexport) funcname(HWND hwndParent, int string_size, char *variables, stack_t **stacktop) + +BOOL WINAPI DllMain(HANDLE hInst, ULONG ul_reason_for_call, LPVOID lpReserved) { + return TRUE; +} + +// Functions + +NSISFunction(Register) { + + EXDLL_INIT(); + + char filename[1024]; + popstring(filename); + + wchar_t ole_filename[1024]; + MultiByteToWideChar(CP_ACP, 0, filename, 1024, ole_filename, 1024); + + ITypeLib* typeLib; + HRESULT hr; + + hr = LoadTypeLib(ole_filename, &typeLib); + + if (SUCCEEDED(hr)) { + + RegisterTypeLib(typeLib, ole_filename, NULL); + + hr = typeLib->Release(); + + } + +} + +NSISFunction(UnRegister) { + + EXDLL_INIT(); + + char filename[1024]; + popstring(filename); + + wchar_t ole_filename[1024]; + MultiByteToWideChar(CP_ACP, 0, filename, 1024, ole_filename, 1024); + + ITypeLib* typeLib; + HRESULT hr; + + hr = LoadTypeLibEx(ole_filename, REGKIND_NONE, &typeLib); + + if (SUCCEEDED(hr)) + { + + TLIBATTR* typelibAttr; + + hr = typeLib->GetLibAttr(&typelibAttr); + + if(SUCCEEDED(hr)) + { + + UnRegisterTypeLib(typelibAttr->guid, + typelibAttr->wMajorVerNum, + typelibAttr->wMinorVerNum, + typelibAttr->lcid, + typelibAttr->syskind); + + typeLib->ReleaseTLibAttr(typelibAttr); + + } + + typeLib->Release(); + + } + +} + +NSISFunction(GetLibVersion) { + + EXDLL_INIT(); + + char filename[1024]; + popstring(filename); + + wchar_t ole_filename[1024]; + MultiByteToWideChar(CP_ACP, 0, filename, 1024, ole_filename, 1024); + + ITypeLib* typeLib; + HRESULT hr; + + hr = LoadTypeLib(ole_filename, &typeLib); + + if (SUCCEEDED(hr)) + { + + TLIBATTR* typelibAttr; + + hr = typeLib->GetLibAttr(&typelibAttr); + + if (SUCCEEDED(hr)) + { + + char buf[33]; + + itoa (typelibAttr->wMajorVerNum, buf, 10); + pushstring(buf); + itoa (typelibAttr->wMinorVerNum, buf, 10); + pushstring(buf); + + } + + typeLib->Release(); + + } + +} \ No newline at end of file diff --git a/Contrib/Library/TypeLib/TypeLib.dsp b/Contrib/Library/TypeLib/TypeLib.dsp new file mode 100644 index 00000000..ebe58c77 --- /dev/null +++ b/Contrib/Library/TypeLib/TypeLib.dsp @@ -0,0 +1,109 @@ +# Microsoft Developer Studio Project File - Name="TypeLib" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=TypeLib - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "TypeLib.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "TypeLib.mak" CFG="TypeLib - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "TypeLib - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "TypeLib - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "TypeLib - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "TypeLib_EXPORTS" /YX /FD /c +# ADD CPP /nologo /MT /W3 /GX /O1 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "TypeLib_EXPORTS" /YX /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib delayimp.lib /nologo /entry:"DllMain" /dll /machine:I386 /out:"..\..\..\Plugins\TypeLib.dll" /opt:nowin98 /DELAYLOAD:oleaut32.dll +# SUBTRACT LINK32 /pdb:none + +!ELSEIF "$(CFG)" == "TypeLib - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "TypeLib_EXPORTS" /YX /FD /GZ /c +# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "TypeLib_EXPORTS" /FR /YX /FD /GZ /c +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib delayimp.lib /nologo /dll /debug /machine:I386 /pdbtype:sept /DELAYLOAD:oleaut32.dll +# SUBTRACT LINK32 /pdb:none + +!ENDIF + +# Begin Target + +# Name "TypeLib - Win32 Release" +# Name "TypeLib - Win32 Debug" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=.\TypeLib.cpp +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# End Group +# Begin Group "Resource Files" + +# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" +# End Group +# End Target +# End Project diff --git a/Contrib/Library/TypeLib/TypeLib.dsw b/Contrib/Library/TypeLib/TypeLib.dsw new file mode 100644 index 00000000..40bdfb4b --- /dev/null +++ b/Contrib/Library/TypeLib/TypeLib.dsw @@ -0,0 +1,29 @@ +Microsoft Developer Studio Workspace File, Format Version 6.00 +# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! + +############################################################################### + +Project: "TypeLib"=.\TypeLib.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Global: + +Package=<5> +{{{ +}}} + +Package=<3> +{{{ +}}} + +############################################################################### + diff --git a/Include/Library.nsh b/Include/Library.nsh new file mode 100644 index 00000000..e16167d6 --- /dev/null +++ b/Include/Library.nsh @@ -0,0 +1,590 @@ +/* + +*********************** +Macro - Install Library +*********************** + +This macro can be used to install DLL and TLB libraries. It checks for version numbers and Windows file protection, +registers the files and can update files on reboot. + +To ask the user for a reboot if required, use the Modern UI with a Finish page or use IfRebootFlag and make your +own page or message box. + +Usage: + +!insertmacro InstallLib libtype shared protection localfile destfile tempbasedir + +Parameters: + +libtype The type of the library + + DLL Dynamic link library (DLL) + REGDLL DLL that has to be registered + TLB Type library or DLL that contains a type LIBRARY + REGDLLTLB DLL that has to be registered and contains a type library + +shared Specify whether the library is shared with other applications + + NOTSHARED The library is not shared + $VARNAME Variable that is empty when the application is installed for the first time, + which is when the shared library count will be increased. + +install Specify the installation method + + REBOOT_PROTECTED * Upgrade the libary on reboot when in use (required for system files). + * Upgrade the library if the file is not protected by Windows File Protection. + + NOREBOOT_PROTECTED * Warns the user when the library is in use. The user will have to close + applications using the library. + * Upgrade the library if the file is not protected by Windows File Protection. + + REBOOT_NOTPROTECTED * Upgrade the libary on reboot when in use (required for system files). + * Upgrade the library without checking for Windows File Protection. + + NOREBOOT_NOTPROTECTED * Warns the user when the library is in use. The user will have to close + applications using the library. + * Upgrade the library without checking for Windows File Protection. + +localfile Location of the library on the compiler system + +destfile Location to store the library on the user's system + +tempbasedir Directory on the user's system to store a temporary file when the system has + to be rebooted. + + For Windows 9x/ME support, this directory should be on the same volume as the + destination file (destfile). + The Windows temp directory could be located on any volume, so you cannot use + this directory. + +Notes: + +* If you want to support Windows 9x/ME, you can only use short filenames (8.3). + +* You can only compile scripts using this macro on Windows systems. + +------------------------ + +Example: + +Var ALREADY_INSTALLED +;Add code here that sets $ALREADY_INSTALLED to a non-zero value if the application is +;already installed. + +!insertmacro InstallLib REGDLL $ALREADY_INSTALLED REBOOT_NOTPROTECTED dllname.dll $SYSDIR\dllname.dll $SYSDIR + + +************************* +Macro - Uninstall Library +************************* + +This macro can be used to uninstall DLL and TLB libraries. It unregisters files and can remove them on reboot. + +Usage: + +!insertmacro UnInstallLib libtype shared uninstall file + +Parameters: + +libtype The type of the library + + DLL Dynamic link library (DLL) + REGDLL DLL that has to be registered + TLB Type library or DLL that contains a type LIBRARY + REGTLB DLL that has to be registered and contains a type library + +shared Specify whether the library is shared with other applications + + NOTSHARED The library is not shared + SHARE The library is shared and should be removed if the shared library count + indicates that the file is not in use anymore. + +uninstall Specify the uninstallation method + + NOREMOVE The library should not be removed. + You should use this option for common or important system files such as the + Visual Basic/C++/MFC runtimes. + + REBOOT_PROTECTED * Remove the libary on reboot when in use (required for system files). + * Remove the library if the file is not protected by Windows File Protection. + + NOREBOOT_PROTECTED * Warns the user when the library is in use. The user will have to close + applications using the library. + * Remove the library if the file is not protected by Windows File Protection. + + REBOOT_NOTPROTECTED * Remove the libary on reboot when in use (required for system files). + * Remove the library without checking for Windows File Protection. + + NOREBOOT_NOTPROTECTED * Warns the user when the library is in use. The user will have to close + applications using the library. + * Remove the library without checking for Windows File Protection. + +file Location of the library + +------------------------ + +Example: + +!insertmacro UnInstallLib REGDLL SHARED REBOOT_NOTPROTECTED $SYSDIR\dllname.dll + +*/ + +!ifndef LIB_INCLUDED + +!define LIB_INCLUDED + +!macro InstallLib libtype shared install localfile destfile tempbasedir + + !verbose push + !verbose 3 + + Push $R0 + Push $R1 + Push $R2 + Push $R3 + Push $R4 + Push $R5 + + ;------------------------ + ;Define + + !define INSTALLLIB_UNIQUE ${__LINE__} + + !define INSTALLLIB_LIBTYPE_${libtype} + !define INSTALLLIB_LIBTYPE_SET INSTALLLIB_LIBTYPE_${libtype} + !define INSTALLLIB_SHARED_${shared} + !define INSTALLLIB_SHARED_SET INSTALLLIB_SHARED_${shared} + !define INSTALLLIB_INSTALL_${install} + !define INSTALLLIB_INSTALL_SET INSTALLLIB_INSTALL_${install} + + ;------------------------ + ;Validate + + !ifndef INSTALLLIB_LIBTYPE_DLL & INSTALLLIB_LIBTYPE_REGDLL & INSTALLLIB_LIBTYPE_TLB & \ + INSTALLLIB_LIBTYPE_REGDLLTLB + !error "InstallLib: Incorrect setting for parameter: libtype" + !endif + + !ifndef INSTALLLIB_INSTALL_REBOOT_PROTECTED & INSTALLLIB_INSTALL_REBOOT_NOTPROTECTED & \ + INSTALLLIB_INSTALL_NOREBOOT_PROTECTED & INSTALLLIB_INSTALL_NOREBOOT_NOTPROTECTED + !error "InstallLib: Incorrect setting for parameter: install" + !endif + + ;------------------------ + ;Copy the parameters used on run-time to a variable + ;This allows the usage of variables as parameter + + StrCpy $R4 "${destfile}" + StrCpy $R5 "${tempbasedir}" + + ;------------------------ + ;Shared library count + + !ifndef INSTALLLIB_SHARED_NOTSHARED + + StrCmp ${shared} "" 0 installlib.noshareddllincrease_${INSTALLLIB_UNIQUE} + + ReadRegDword $R0 HKLM Software\Microsoft\Windows\CurrentVersion\SharedDLLs $R4 + IntOp $R0 $R0 + 1 + WriteRegDWORD HKLM Software\Microsoft\Windows\CurrentVersion\SharedDLLs $R4 $R0 + + installlib.noshareddllincrease_${INSTALLLIB_UNIQUE}: + + !endif + + ;------------------------ + ;Check Windows File Protection + + !ifdef INSTALLLIB_INSTALL_REBOOT_PROTECTED | INSTALLLIB_INSTALL_NOREBOOT_PROTECTED + + System::Call "sfc::SfcIsFileProtected(i 0, w R4) i.R0" + + StrCmp $R0 "error" installlib.notprotected_${INSTALLLIB_UNIQUE} + StrCmp $R0 "0" installlib.notprotected_${INSTALLLIB_UNIQUE} + + Goto installlib.done_${INSTALLLIB_UNIQUE} + + installlib.notprotected_${INSTALLLIB_UNIQUE}: + + !endif + + ;------------------------ + ;Check file + + IfFileExists $R4 0 installlib.copy_${INSTALLLIB_UNIQUE} + + ;------------------------ + ;Get version information + + !execute '"${NSISDIR}\Contrib\Library\LibraryLocal\LibraryLocal.exe" D ${LOCALFILE}' + !include "${NSISDIR}\Contrib\Library\LibraryLocal\LibraryLocal.nsh" + + !ifdef LIBRARY_VERSION_FILENOTFOUND + !error "InstallLib: The library ${LOCALFILE} could not be found." + !endif + + !ifndef LIBRARY_VERSION_NONE + + StrCpy $R0 ${LIBRARY_VERSION_HIGH} + StrCpy $R1 ${LIBRARY_VERSION_LOW} + + GetDLLVersion $R4 $R2 $R3 + + !undef LIBRARY_VERSION_HIGH + !undef LIBRARY_VERSION_LOW + + !ifndef INSTALLLIB_LIBTYPE_TLB & INSTALLLIB_LIBTYPE_REGDLLTLB + + IntCmpU $R0 $R2 0 installlib.done_${INSTALLLIB_UNIQUE} installlib.upgrade_${INSTALLLIB_UNIQUE} + IntCmpU $R1 $R3 installlib.done_${INSTALLLIB_UNIQUE} installlib.done_${INSTALLLIB_UNIQUE} \ + installlib.upgrade_${INSTALLLIB_UNIQUE} + + !else + + !execute '"${NSISDIR}\Contrib\LIBRARY\LIBRARYLocal\LibraryLocal.exe" T ${LOCALFILE}' + !include "${NSISDIR}\Contrib\LIBRARY\LIBRARYLocal\LibraryLocal.nsh" + + !ifdef LIBRARY_VERSION_FILENOTFOUND + !error "InstallLib: The library ${LOCALFILE} could not be found." + !endif + + !ifndef LIBRARY_VERSION_NONE + + IntCmpU $R0 $R2 0 installlib.done_${INSTALLLIB_UNIQUE} installlib.upgrade_${INSTALLLIB_UNIQUE} + IntCmpU $R1 $R3 0 installlib.done_${INSTALLLIB_UNIQUE} \ + installlib.upgrade_${INSTALLLIB_UNIQUE} + + !else + + IntCmpU $R0 $R2 0 installlib.done_${INSTALLLIB_UNIQUE} installlib.upgrade_${INSTALLLIB_UNIQUE} + IntCmpU $R1 $R3 installlib.done_${INSTALLLIB_UNIQUE} installlib.done_${INSTALLLIB_UNIQUE} \ + installlib.upgrade_${INSTALLLIB_UNIQUE} + + !endif + + !endif + + !else + + !undef LIBRARY_VERSION_NONE + + !execute '"${NSISDIR}\Contrib\LIBRARY\LIBRARYLocal\LibraryLocal.exe" T ${LOCALFILE}' + !include "${NSISDIR}\Contrib\LIBRARY\LIBRARYLocal\LibraryLocal.nsh" + + !endif + + !ifdef INSTALLLIB_LIBTYPE_TLB | INSTALLLIB_LIBTYPE_REGDLLTLB + + !ifndef LIBRARY_VERSION_NONE + + StrCpy $R0 ${LIBRARY_VERSION_HIGH} + StrCpy $R1 ${LIBRARY_VERSION_LOW} + + TypeLib::GetLibVersion $R4 + Pop $R2 + Pop $R3 + + IntCmpU $R0 $R2 0 installlib.register_${INSTALLLIB_UNIQUE} installlib.upgrade_${INSTALLLIB_UNIQUE} + IntCmpU $R1 $R3 installlib.register_${INSTALLLIB_UNIQUE} installlib.register_${INSTALLLIB_UNIQUE} \ + installlib.upgrade_${INSTALLLIB_UNIQUE} + + !undef LIBRARY_VERSION_HIGH + !undef LIBRARY_VERSION_LOW + + !else + + !undef LIBRARY_VERSION_NONE + + !endif + + !endif + + ;------------------------ + ;Upgrade + + installlib.upgrade_${INSTALLLIB_UNIQUE}: + + ;------------------------ + ;Copy + + !ifdef INSTALLLIB_INSTALL_NOREBOOT_PROTECTED | INSTALLLIB_INSTALL_NOREBOOT_NOTPROTECTED + + installlib.copy_${INSTALLLIB_UNIQUE}: + + StrCpy $R0 $R4 + Call :installlib.file_${INSTALLLIB_UNIQUE} + + !else + + ClearErrors + + StrCpy $R0 $R4 + Call :installlib.file_${INSTALLLIB_UNIQUE} + + IfErrors 0 installlib.register_${INSTALLLIB_UNIQUE} + + SetOverwrite lastused + + ;------------------------ + ;Copy on reboot + + GetTempFileName $R0 $R5 + Call :installlib.file_${INSTALLLIB_UNIQUE} + Rename /REBOOTOK $R0 $R4 + + ;------------------------ + ;Register on reboot + + !ifdef INSTALLLIB_LIBTYPE_REGDLL | INSTALLLIB_LIBTYPE_REGDLLTLB + + GetTempFileName $R0 $R5 + File /oname=$R0 "${NSISDIR}\Contrib\Library\RegTool\RegTool.bin" + + WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\RunOnce" \ + "$R4" '"$R0" D $R4' + + !endif + + !ifdef INSTALLLIB_LIBTYPE_TLB | INSTALLLIB_LIBTYPE_REGDLLTLB + + GetTempFileName $R0 $R5 + File /oname=$R0 "${NSISDIR}\Contrib\Library\RegTool\RegTool.bin" + + WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\RunOnce" \ + "$R4" '"$R0" T $R4' + + !endif + + Goto installlib.done_${INSTALLLIB_UNIQUE} + + installlib.copy_${INSTALLLIB_UNIQUE}: + StrCpy $R0 $R4 + Call :installlib.file_${INSTALLLIB_UNIQUE} + + !endif + + ;------------------------ + ;Register + + installlib.register_${INSTALLLIB_UNIQUE}: + + !ifdef INSTALLLIB_LIBTYPE_REGDLL | INSTALLLIB_LIBTYPE_REGDLLTLB + + RegDLL $R4 + + !endif + + !ifdef INSTALLLIB_LIBTYPE_TLB | INSTALLLIB_LIBTYPE_REGDLLTLB + + TypeLib::Register $R4 + + !endif + + ;------------------------ + ;Done + + installlib.done_${INSTALLLIB_UNIQUE}: + + Pop $R5 + Pop $R4 + Pop $R3 + Pop $R2 + Pop $R1 + Pop $R0 + + ;------------------------ + ;End + + Goto installlib.end_${INSTALLLIB_UNIQUE} + + ;------------------------ + ;Extract + + !ifdef INSTALLLIB_INSTALL_REBOOT_PROTECTED | INSTALLLIB_INSTALL_REBOOT_NOTPROTECTED + + SetOverwrite try + + installlib.file_${INSTALLLIB_UNIQUE}: + File /oname=$R0 "${LOCALFILE}" + Return + + installlib.end_${INSTALLLIB_UNIQUE}: + + SetOverwrite lastused + + !else + + SetOverwrite on + + installlib.file_${INSTALLLIB_UNIQUE}: + File /oname=$R0 "${LOCALFILE}" + Return + + installlib.end_${INSTALLLIB_UNIQUE}: + + SetOverwrite lastused + + !endif + + ;------------------------ + ;Undefine + + !undef INSTALLLIB_UNIQUE + + !undef ${INSTALLLIB_LIBTYPE_SET} + !undef INSTALLLIB_LIBTYPE_SET + !undef ${INSTALLLIB_SHARED_SET} + !undef INSTALLLIB_SHARED_SET + !undef ${INSTALLLIB_INSTALL_SET} + !undef INSTALLLIB_INSTALL_SET + + !verbose pop + +!macroend + +!macro UnInstallLib libtype shared uninstall file + + !verbose push + !verbose 3 + + Push $R0 + Push $R1 + + ;------------------------ + ;Define + + !define UNINSTALLLIB_UNIQUE ${__LINE__} + + !define UNINSTALLLIB_LIBTYPE_${libtype} + !define UNINSTALLLIB_LIBTYPE_SET UNINSTALLLIB_LIBTYPE_${libtype} + !define UNINSTALLLIB_SHARED_${shared} + !define UNINSTALLLIB_SHARED_SET UNINSTALLLIB_SHARED_${shared} + !define UNINSTALLLIB_UNINSTALL_${uninstall} + !define UNINSTALLLIB_UNINSTALL_SET UNINSTALLLIB_UNINSTALL_${uninstall} + + ;------------------------ + ;Validate + + !ifndef UNINSTALLLIB_LIBTYPE_DLL & UNINSTALLLIB_LIBTYPE_REGDLL & UNINSTALLLIB_LIBTYPE_TLB & \ + UNINSTALLLIB_LIBTYPE_REGDLLTLB + !error "UnInstallLib: Incorrect setting for parameter: libtype" + !endif + + !ifndef UNINSTALLLIB_SHARED_NOTSHARED & UNINSTALLLIB_SHARED_SHARED + !error "UnInstallLib: Incorrect setting for parameter: shared" + !endif + + !ifndef UNINSTALLLIB_UNINSTALL_NOREMOVE & UNINSTALLLIB_UNINSTALL_REBOOT_PROTECTED & \ + UNINSTALLLIB_UNINSTALL_REBOOT_NOTPROTECTED & UNINSTALLLIB_UNINSTALL_NOREBOOT_PROTECTED & \ + UNINSTALLLIB_UNINSTALL_NOREBOOT_NOTPROTECTED + !error "UnInstallLib: Incorrect setting for parameter: uninstall" + !endif + + ;------------------------ + ;Copy the parameters used on run-time to a variable + ;This allows the usage of variables as parameter + + StrCpy $R1 "${file}" + + ;------------------------ + ;Shared library count + + !ifdef UNINSTALLLIB_SHARED_SHARED + + ReadRegDword $R0 HKLM Software\Microsoft\Windows\CurrentVersion\SharedDLLs $R1 + StrCmp $R0 "" uninstalllib.remove_${UNINSTALLLIB_UNIQUE} + + IntOp $R0 $R0 - 1 + IntCmp $R0 0 uninstalllib.shareddllremove_${UNINSTALLLIB_UNIQUE} \ + uninstalllib.shareddllremove_${UNINSTALLLIB_UNIQUE} uninstalllib.shareddllinuse_${UNINSTALLLIB_UNIQUE} + + uninstalllib.shareddllremove_${UNINSTALLLIB_UNIQUE}: + DeleteRegValue HKLM Software\Microsoft\Windows\CurrentVersion\SharedDLLs $R1 + !ifndef UNINSTALLLIB_SHARED_SHAREDNOREMOVE + Goto uninstalllib.remove_${UNINSTALLLIB_UNIQUE} + !endif + + uninstalllib.shareddllinuse_${UNINSTALLLIB_UNIQUE}: + WriteRegDWORD HKLM Software\Microsoft\Windows\CurrentVersion\SharedDLLs $R1 $R0 + Goto uninstalllib.done_${UNINSTALLLIB_UNIQUE} + + !endif + + ;------------------------ + ;Remove + + uninstalllib.remove_${UNINSTALLLIB_UNIQUE}: + + !ifndef UNINSTALLLIB_UNINSTALL_NOREMOVE + + ;------------------------ + ;Check Windows File Protection + + !ifdef UNINSTALLLIB_UNINSTALL_REBOOT_PROTECTED | UNINSTALLLIB_UNINSTALL_NOREBOOT_PROTECTED + + System::Call "sfc::SfcIsFileProtected(i 0, w $R1) i.R0" + + StrCmp $R0 "error" uninstalllib.notprotected_${UNINSTALLLIB_UNIQUE} + StrCmp $R0 "0" uninstalllib.notprotected_${UNINSTALLLIB_UNIQUE} + + Goto uninstalllib.done_${UNINSTALLLIB_UNIQUE} + + uninstalllib.notprotected_${UNINSTALLLIB_UNIQUE}: + + !endif + + ;------------------------ + ;Unregister + + !ifdef UNINSTALLLIB_LIBTYPE_REGDLL | UNINSTALLLIB_LIBTYPE_REGDLLTLB + + UnRegDLL $R1 + + !endif + + !ifdef INSTALLLIB_LIBTYPE_TLB | UNINSTALLLIB_LIBTYPE_REGDLLTLB + + TypeLib::UnRegister $R1 + + !endif + + ;------------------------ + ;Delete + + !ifdef UNINSTALLLIB_UNINSTALL_REBOOT_PROTECTED | UNINSTALLLIB_UNINSTALL_REBOOT_NOTPROTECTED + + Delete /REBOOTOK $R1 + + !else + + Delete $R1 + + !endif + + !endif + + ;------------------------ + ;Done + + uninstalllib.done_${UNINSTALLLIB_UNIQUE}: + + Pop $R1 + Pop $R0 + + ;------------------------ + ;Undefine + + !undef UNINSTALLLIB_UNIQUE + + !undef ${UNINSTALLLIB_LIBTYPE_SET} + !undef UNINSTALLLIB_LIBTYPE_SET + !undef ${UNINSTALLLIB_SHARED_SET} + !undef UNINSTALLLIB_SHARED_SET + !undef ${UNINSTALLLIB_UNINSTALL_SET} + !undef UNINSTALLLIB_UNINSTALL_SET + + !verbose pop + +!macroend + +!endif diff --git a/Include/UpgradeDLL.nsh b/Include/UpgradeDLL.nsh index 413a7011..73de66c2 100644 --- a/Include/UpgradeDLL.nsh +++ b/Include/UpgradeDLL.nsh @@ -1,28 +1,45 @@ +/* + +NOTE: +----- +This macro is provided for backwards compatibility with NSIS 2.0 scripts. +It's recommended you update your scripts to use the new Library.nsh macros. + + +Macro - Upgrade DLL File +Written by Joost Verburg +------------------------ + +Parameters: +LOCALFILE Location of the new DLL file (on the compiler system) +DESTFILE Location of the DLL file that should be upgraded (on the user's system) +TEMPBASEDIR Directory on the user's system to store a temporary file when the system has + to be rebooted. + For Win9x/ME support, this should be on the same volume as DESTFILE. + The Windows temp directory could be located on any volume, so you cannot use + this directory. + +Define UPGRADEDLL_NOREGISTER if you want to upgrade a DLL that does not have to be registered. + +Notes: + +* If you want to support Windows 9x/ME, you can only use short filenames (8.3). + +* This macro uses the GetDLLVersionLocal command to retrieve the version of local libraries. + This command is only supported when compiling on a Windows system. + +------------------------ + +Example: + +!insertmacro UpgradeDLL "dllname.dll" "$SYSDIR\dllname.dll" "$SYSDIR" + +*/ + !ifndef UPGRADEDLL_INCLUDED !define UPGRADEDLL_INCLUDED -; Macro - Upgrade DLL File -; Written by Joost Verburg -; ------------------------ -; -; Parameters: -; LOCALFILE - Location of the new DLL file (on the compiler system) -; DESTFILE - Location of the DLL file that should be upgraded (on the user's system) -; TEMPBASEDIR - Directory on the user's system to store a temporary file when the system has -; to be rebooted. -; For Win9x support, this should be on the same volume as the DESTFILE! -; The Windows temp directory could be located on any volume, so you cannot use -; this directory. -; -; Define UPGRADEDLL_NOREGISTER if you want to upgrade a DLL that does not have to be registered. -; -; Note: If you want to support Win9x, you can only use short filenames (8.3). -; -; Example of usage: -; !insertmacro UpgradeDLL "dllname.dll" "$SYSDIR\dllname.dll" "$SYSDIR" -; - !macro UpgradeDLL LOCALFILE DESTFILE TEMPBASEDIR Push $R0 @@ -32,11 +49,10 @@ Push $R4 Push $R5 - ;------------------------ - ;Unique number for labels - !define UPGRADEDLL_UNIQUE ${__LINE__} + SetOverwrite try + ;------------------------ ;Copy the parameters used on run-time to a variable ;This allows the usage of variables as paramter @@ -45,7 +61,7 @@ StrCpy $R5 "${TEMPBASEDIR}" ;------------------------ - ;Check file and version + ;Get version information IfFileExists $R4 0 upgradedll.copy_${UPGRADEDLL_UNIQUE} @@ -59,9 +75,7 @@ upgradedll.upgrade_${UPGRADEDLL_UNIQUE} ;------------------------ - ;Let's upgrade the DLL! - - SetOverwrite try + ;Upgrade upgradedll.upgrade_${UPGRADEDLL_UNIQUE}: !ifndef UPGRADEDLL_NOREGISTER @@ -70,7 +84,7 @@ !endif ;------------------------ - ;Try to copy the DLL directly + ;Copy ClearErrors StrCpy $R0 $R4 @@ -78,31 +92,32 @@ IfErrors 0 upgradedll.noreboot_${UPGRADEDLL_UNIQUE} ;------------------------ - ;DLL is in use. Copy it to a temp file and Rename it on reboot. + ;Copy on reboot GetTempFileName $R0 $R5 Call :upgradedll.file_${UPGRADEDLL_UNIQUE} Rename /REBOOTOK $R0 $R4 ;------------------------ - ;Register the DLL on reboot + ;Register on reboot - !ifndef UPGRADEDLL_NOREGISTER - WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\RunOnce" \ - "Register $R4" 'rundll32.exe "$R4",DllRegisterServer' - !endif + GetTempFileName $R0 $R5 + File /oname=$R0 "${NSISDIR}\Contrib\Library\RegTool\RegTool.bin" + + WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\RunOnce" \ + "$R4" '"$R0" D $R4' Goto upgradedll.done_${UPGRADEDLL_UNIQUE} ;------------------------ - ;DLL does not exist - just extract + ;DLL does not exist upgradedll.copy_${UPGRADEDLL_UNIQUE}: StrCpy $R0 $R4 Call :upgradedll.file_${UPGRADEDLL_UNIQUE} ;------------------------ - ;Register the DLL + ;Register upgradedll.noreboot_${UPGRADEDLL_UNIQUE}: !ifndef UPGRADEDLL_NOREGISTER @@ -127,7 +142,7 @@ Goto upgradedll.end_${UPGRADEDLL_UNIQUE} ;------------------------ - ;Called to extract the DLL + ;Extract upgradedll.file_${UPGRADEDLL_UNIQUE}: File /oname=$R0 "${LOCALFILE}" @@ -135,13 +150,10 @@ upgradedll.end_${UPGRADEDLL_UNIQUE}: - ;------------------------ - ;Restore settings - - SetOverwrite lastused - - !undef UPGRADEDLL_UNIQUE + SetOverwrite lastused + + !undef UPGRADEDLL_UNIQUE !macroend -!endif \ No newline at end of file +!endif diff --git a/Plugins/TypeLib.dll b/Plugins/TypeLib.dll new file mode 100644 index 0000000000000000000000000000000000000000..95b2b04774b4fb2df36ecb8a04fdd24513b4f15b GIT binary patch literal 4608 zcmeHJZ){sv6+h2*)7QjF++d^7M5;3^7Fda%{R~>kKu*a^S{8RNY5tIm1f2NM*mG^` z<-M&%O=vL|eY>+XP>}eeiG>V-gg|_lSQz=>CRLkEo#enixJ{6vNt>LdqA4x7g3`yi z&vs%JwW^TN_Mun$-Fxmi=brOB=RH4P|Io`|1^^2}*8%2mrNd{;51w*puG#-)4ZObR z?WQ@V>+PoA@z8`bF2|0`ffLTLKr|XtoTHLcR-?{P)Y<;bG3SX`P->~Ju5=Yczq0() zr7OScnJ(e2S6ipExL(HyU(^n0@W7A89-820cW34IrvBugH8XKpv?qx0t z09}j)O15>VX{us&S3(79*rL{kD}~e8+YH%M=nvJ|3MO=Nj-aA?p=_Jkn-Y%RdFIww%5h&wu0(_%I z4hEC}KoE;DYNtMxh_d0s6fFfe;HaKX)W3#qc7_ii-6Bho*ciaORE-M5uhHc)oL`3p6?^q&Rzp6 z01>RShQDB+r6Gx6n{C83m4rLGF6IVxU7w?Gu9!-}EnV*xi6(6ZSs^6UAtLmlVK@ulO5Yc zjXQ1nDzc(9ttFaY3Rk9tH4!P)zTvAEb6X~W#04wW1fo1J4jdaFY(LTgS1{!K9!iN2j%fFOMj+z)M3C+XmJav zc42glou$j>?g8D=h{hsAZSozZ(jaLn)S;d}IAT{092{v>9w(honJ=AvlK#W0`-uO} z!NaUt*Lu>cRukbC@w23nNv^6->uLsr)?-lG2(|UU$|@wV6caQUWw9v%KPb$x@o(=` zHJqi7xxUoAx`ea_2De>EQyb1=fW@zmJiENWLgKWG1*PI5^Vzn1wx8VK|CCo;Y~r7L zp5Jw5VPMmIW`R4mw=J1|;r)vY9C`8MFEZ!$9ywRh(RxGv+X($SBqnW@L}1m*WO}k9 z%!Dg9cj4DYwGqEH_cMG)k;&lT@Z#m|(NEf4_NuhnOuAe)l&zTZ2Faqt;<`l^^Fh=v zk&ARSuWWXr{590{x~$Y^Wn*P^<%5-M)v|gkf0JyXmmNLYUAFxD<`uc775!dd<=R&C zeSXi;C(zK)>$3B!D6uG6^H=lP#8n_~kw23wG|$MwJ^#A+LX-`A6ToAL7Q`12hY=CP zw-7HOeuDTNB8|u(?j6r`32lA7yr(4?iNFv5gAP6?ULok+0P!-)uOS|G%-}WXO~f0B zS;YO$tvh!tBTXom?RP8y|4V&;XF4OX(Lkg_mL!1RnK2V{6!=s7BM6}tmROnrfeA&B<(Q1m3u6X?#WTq8 zr>34jXhK4NDXxTK(ehrDgnJP&h@dA- z(0eLQc^VI$@(GRhOY#Iw*CQPdO(1RPi*Aeb)T8my?7(Cl*uIDOK4KK{(Pa6E)&H#n z_{8HFd^hLhnmIRji2DjRzzuUJIGIavKjdEFmbfe2b*{?&F?WNz!#(JJ$^E)}-hIJ+ z-3^{GPuw%*Ip_I-XVzoqJNY4givKbH3;s8Jmj8gi%U5~pybWHbH|{;{{jT@7-amTj Ue}eInaTbo{@M`#Ie5f7x52iC;-T(jq literal 0 HcmV?d00001