From 096373344d5ac33c7990d4678916c748ae569bb9 Mon Sep 17 00:00:00 2001 From: kichik Date: Thu, 23 Jun 2005 11:24:11 +0000 Subject: [PATCH] Library improvements with lots of help from stb: - InstallLib will register DLLs after reboot in the order they were specified in the script - InstallLib will register every DLL on reboot if the reboot flag is already set - rewrote RegTool in C - RegTool compiles from source code - RegTool will not run when double clicked - RegTool will register each DLL on a separate process to avoid conflicts git-svn-id: https://svn.code.sf.net/p/nsis/code/NSIS/trunk@4127 212acab6-be3b-0410-9dea-997c60f758d6 --- Contrib/Library/RegTool/RegTool.bin | Bin 19451 -> 0 bytes Contrib/Library/RegTool/RegTool.c | 273 +++++++++++++++++++++++ Contrib/Library/RegTool/RegTool.nsi | 126 ----------- Contrib/Library/RegTool/SConscript | 12 +- Include/Library.nsh | 331 ++++++++++++---------------- 5 files changed, 422 insertions(+), 320 deletions(-) delete mode 100644 Contrib/Library/RegTool/RegTool.bin create mode 100644 Contrib/Library/RegTool/RegTool.c delete mode 100644 Contrib/Library/RegTool/RegTool.nsi diff --git a/Contrib/Library/RegTool/RegTool.bin b/Contrib/Library/RegTool/RegTool.bin deleted file mode 100644 index a80f1da347e08036b3b09c0ecb8c4c72a35286d2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19451 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 diff --git a/Contrib/Library/RegTool/RegTool.c b/Contrib/Library/RegTool/RegTool.c new file mode 100644 index 00000000..24db286a --- /dev/null +++ b/Contrib/Library/RegTool/RegTool.c @@ -0,0 +1,273 @@ +#include + +#define STR_SIZE 1024 + +void RunSelf(char cmd, char *file); +void RegDll(char *file); +void RegTypeLib(char *file); +void DeleteFileOnReboot(char *pszFile); + +int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) +{ + char *cmdline; + char seekchar = ' '; + + cmdline = GetCommandLine(); + if (*cmdline == '\"') + seekchar = *cmdline++; + + while (*cmdline && *cmdline != seekchar) + cmdline = CharNext(cmdline); + cmdline = CharNext(cmdline); + while (*cmdline == ' ') + cmdline++; + + if (*cmdline++ != '/') + { + ExitProcess(1); + return 0; + } + + if (*cmdline == 'S') + { + HKEY rootkey; + + if (SUCCEEDED(RegOpenKeyEx(HKEY_LOCAL_MACHINE, "Software\\NSIS.Library.RegTool.v2", 0, KEY_READ, &rootkey))) + { + char keyname[STR_SIZE]; + + while (RegEnumKey(rootkey, 0, keyname, STR_SIZE) == ERROR_SUCCESS) + { + HKEY key; + + if (SUCCEEDED(RegOpenKeyEx(rootkey, keyname, 0, KEY_READ, &key))) + { + DWORD t, count, l = sizeof(DWORD); + + if (SUCCEEDED(RegQueryValueEx(key, "count", NULL, &t, (LPBYTE) &count, &l)) && t == REG_DWORD) + { + DWORD j; + char valname[128], mode[2], file[STR_SIZE]; + + for (j = 1; j <= count; j++) + { + wsprintf(valname, "%u.mode", j); + l = sizeof(mode); + if (FAILED(RegQueryValueEx(key, valname, NULL, &t, mode, &l)) || t != REG_SZ) + continue; + + wsprintf(valname, "%u.file", j); + l = STR_SIZE; + if (FAILED(RegQueryValueEx(key, valname, NULL, &t, file, &l)) || t != REG_SZ) + continue; + + RunSelf(mode[0], file); + } + } + + RegCloseKey(key); + RegDeleteKey(rootkey, keyname); + } + } + + RegCloseKey(rootkey); + RegDeleteKey(HKEY_LOCAL_MACHINE, "Software\\NSIS.Library.RegTool.v2"); + } + + { + char file[STR_SIZE]; + if (GetModuleFileName(GetModuleHandle(NULL), file, STR_SIZE)) + { + DeleteFileOnReboot(file); + } + } + } + else + { + SetErrorMode(SEM_NOOPENFILEERRORBOX | SEM_FAILCRITICALERRORS); + OleInitialize(NULL); + + if (*cmdline == 'D') + { + RegDll(cmdline + 1); + } + else if (*cmdline == 'T') + { + RegTypeLib(cmdline + 1); + } + + OleUninitialize(); + SetErrorMode(0); + } + + ExitProcess(0); + return 0; +} + +void RunSelf(char cmd, char *file) +{ + char self[STR_SIZE]; + char cmdline[STR_SIZE]; + + if (!*file || (cmd != 'D' && cmd != 'T')) + return; + + if (GetModuleFileName(GetModuleHandle(NULL), self, STR_SIZE)) + { + PROCESS_INFORMATION pi; + STARTUPINFO si = { sizeof(STARTUPINFO) }; + + wsprintf(cmdline, "\"%s\" /%c%s", self, cmd, file); + + if (CreateProcess(NULL, cmdline, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)) + { + CloseHandle(pi.hThread); + + WaitForSingleObject(pi.hProcess, INFINITE); + + CloseHandle(pi.hProcess); + } + } +} + +void RegDll(char *file) +{ + HMODULE mod = LoadLibraryEx(file, NULL, LOAD_WITH_ALTERED_SEARCH_PATH); + if (mod) + { + FARPROC regfunc = GetProcAddress(mod, "DllRegisterServer"); + if (regfunc) + regfunc(); + FreeLibrary(mod); + } +} + +void RegTypeLib(char *file) +{ + WCHAR wfile[STR_SIZE]; + + if (MultiByteToWideChar(CP_ACP, 0, file, -1, wfile, STR_SIZE) != 0) + { + ITypeLib* tlib; + if (SUCCEEDED(LoadTypeLib(wfile, &tlib))) { + RegisterTypeLib(tlib, wfile, NULL); + tlib->lpVtbl->Release(tlib); + } + } +} + +char *mystrstri(char *a, char *b) +{ + int l = lstrlen(b); + while (lstrlen(a) >= l) + { + char c = a[l]; + a[l] = 0; + if (!lstrcmpi(a, b)) + { + a[l] = c; + return a; + } + a[l] = c; + a = CharNext(a); + } + return NULL; +} + +void mini_memcpy(void *out, const void *in, int len) +{ + char *c_out=(char*)out; + char *c_in=(char *)in; + while (len-- > 0) + { + *c_out++=*c_in++; + } +} + +void DeleteFileOnReboot(char *pszFile) +{ + BOOL fOk = 0; + HMODULE hLib=GetModuleHandle("KERNEL32.dll"); + if (hLib) + { + typedef BOOL (WINAPI *mfea_t)(LPCSTR lpExistingFileName,LPCSTR lpNewFileName,DWORD dwFlags); + mfea_t mfea; + mfea=(mfea_t) GetProcAddress(hLib,"MoveFileExA"); + if (mfea) + { + fOk=mfea(pszFile, NULL, MOVEFILE_DELAY_UNTIL_REBOOT); + } + } + + if (!fOk) + { + static char szRenameLine[1024]; + static char wininit[1024]; + int cchRenameLine; + char *szRenameSec = "[Rename]\r\n"; + HANDLE hfile, hfilemap; + DWORD dwFileSize, dwRenameLinePos; + + int spn; + + // wininit is used as a temporary here + spn = GetShortPathName(pszFile,wininit,1024); + if (!spn || spn > 1024) + return; + cchRenameLine = wsprintf(szRenameLine,"NUL=%s\r\n",wininit); + + GetWindowsDirectory(wininit, 1024-16); + lstrcat(wininit, "\\wininit.ini"); + hfile = CreateFile(wininit, + GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_ALWAYS, + FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL); + + if (hfile != INVALID_HANDLE_VALUE) + { + dwFileSize = GetFileSize(hfile, NULL); + hfilemap = CreateFileMapping(hfile, NULL, PAGE_READWRITE, 0, dwFileSize + cchRenameLine + 10, NULL); + + if (hfilemap != NULL) + { + LPSTR pszWinInit = (LPSTR) MapViewOfFile(hfilemap, FILE_MAP_WRITE, 0, 0, 0); + + if (pszWinInit != NULL) + { + LPSTR pszRenameSecInFile = mystrstri(pszWinInit, szRenameSec); + if (pszRenameSecInFile == NULL) + { + lstrcpy(pszWinInit+dwFileSize, szRenameSec); + dwFileSize += 10; + dwRenameLinePos = dwFileSize; + } + else + { + char *pszFirstRenameLine = pszRenameSecInFile+10; + char *pszNextSec = mystrstri(pszFirstRenameLine,"\n["); + if (pszNextSec) + { + char *p = ++pszNextSec; + while (p < pszWinInit + dwFileSize) { + p[cchRenameLine] = *p; + p++; + } + + dwRenameLinePos = pszNextSec - pszWinInit; + } + // rename section is last, stick item at end of file + else dwRenameLinePos = dwFileSize; + } + + mini_memcpy(&pszWinInit[dwRenameLinePos], szRenameLine, cchRenameLine); + dwFileSize += cchRenameLine; + + UnmapViewOfFile(pszWinInit); + } + CloseHandle(hfilemap); + } + SetFilePointer(hfile, dwFileSize, NULL, FILE_BEGIN); + SetEndOfFile(hfile); + CloseHandle(hfile); + } + } +} diff --git a/Contrib/Library/RegTool/RegTool.nsi b/Contrib/Library/RegTool/RegTool.nsi deleted file mode 100644 index e3431e4f..00000000 --- a/Contrib/Library/RegTool/RegTool.nsi +++ /dev/null @@ -1,126 +0,0 @@ -; RegTool -; Written by Joost Verburg -; -; This tool is used by the Library.nsh macros to register -; dynamic link libraries and type libraries after a reboot. - -;-------------------------------- - -Name "RegTool" -OutFile "RegToolGenerator.exe" -SilentInstall silent -SilentUninstall silent - -SetCompressor lzma - -Icon "${NSISDIR}\Contrib\Graphics\Icons\classic-install.ico" -UninstallIcon "${NSISDIR}\Contrib\Graphics\Icons\classic-install.ico" - -AllowRootDirInstall true - -;-------------------------------- - -Var MODE -Var FILENAME -Var FOLDER - -;-------------------------------- - -Section - - WriteUninstaller $EXEDIR\RegTool.bin - -SectionEnd - -Section uninstall - - StrCpy $0 -1 - - loop: - - IntOp $0 $0 + 1 - - EnumRegValue $FILENAME HKLM "Software\NSIS.Library.RegTool" $0 - StrCmp $FILENAME "" done - - ReadRegStr $MODE HKLM "Software\NSIS.Library.RegTool" $FILENAME - - StrCmp $MODE "DT" 0 +4 - - Call un.RegDLL - Call un.RegTLB - Goto loop - - StrCmp $MODE "D" 0 +3 - - Call un.RegDLL - Goto loop - - StrCmp $MODE "T" 0 +3 - - Call un.RegTLB - Goto loop - - Goto loop - - done: - - DeleteRegKey HKLM "Software\NSIS.Library.RegTool" - Delete $INSTDIR\NSIS.Library.RegTool.exe - -SectionEnd - -Function un.RegDLL - - Push $FILENAME - Call un.GetParent - Pop $FOLDER - - SetOutPath $FOLDER - RegDLL $FILENAME - -FunctionEnd - -Function un.RegTLB - - TypeLib::Register $FILENAME - -FunctionEnd - -; GetParent -; input, top of stack (e.g. C:\Program Files\Poop) -; output, top of stack (replaces, with e.g. C:\Program Files) -; modifies no other variables. -; -; Usage: -; Push "C:\Program Files\Directory\Whatever" -; Call GetParent -; Pop $R0 -; ; at this point $R0 will equal "C:\Program Files\Directory" - -Function un.GetParent - - Exch $R0 - Push $R1 - Push $R2 - Push $R3 - - StrCpy $R1 0 - StrLen $R2 $R0 - - loop: - IntOp $R1 $R1 + 1 - IntCmp $R1 $R2 get 0 get - StrCpy $R3 $R0 1 -$R1 - StrCmp $R3 "\" get - Goto loop - - get: - StrCpy $R0 $R0 -$R1 - - Pop $R3 - Pop $R2 - Pop $R1 - Exch $R0 - -FunctionEnd diff --git a/Contrib/Library/RegTool/SConscript b/Contrib/Library/RegTool/SConscript index 2228a898..625609da 100644 --- a/Contrib/Library/RegTool/SConscript +++ b/Contrib/Library/RegTool/SConscript @@ -7,13 +7,11 @@ files = Split(""" libs = Split(""" kernel32 oleaut32 - version + advapi32 + user32 + ole32 """) -#Import('BuildUtil') +Import('BuildUtil') -#BuildUtil(target, files, libs, install = 'Bin') - -Import('env') - -env.Distribute('Bin', 'RegTool.bin') +BuildUtil(target, files, libs, entry = 'WinMain', nodeflib = 1, install_as = 'Bin/RegTool.bin') diff --git a/Include/Library.nsh b/Include/Library.nsh index 0f6e7c01..606be165 100644 --- a/Include/Library.nsh +++ b/Include/Library.nsh @@ -1,153 +1,21 @@ -/* - -*********************** -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 install 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 library 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 library 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. - -Options: - -LIBRARY_SHELL_EXTENSION - - Define this before inserting InstallLib macro to call SHChangeNotify with SHCNE_ASSOCCHANGED after registration. Use this to refresh the shell when installing a shell extension or when changing file associations. - -LIBRARY_COM - - Define this before inserting InstallLib macro to call CoFreeUnusedLibraries after registration. Use this for unloading all unnecessary libraries from memory when installing COM libraries. - -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 library 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 library 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 - -Options: - -LIBRARY_SHELL_EXTENSION - - Define this before inserting UninstallLib macro to call SHChangeNotify with SHCNE_ASSOCCHANGED after unregistration. Use this to refresh the shell when uninstalling a shell extension or when changing file associations. - -LIBRARY_COM - - Define this before inserting UninstallLib macro to call CoFreeUnusedLibraries after unregistration. Use this for unloading all unnecessary libraries from memory when uninstalling COM libraries. - ------------------------- - -Example: - -!insertmacro UnInstallLib REGDLL SHARED REBOOT_NOTPROTECTED $SYSDIR\dllname.dll - -*/ +# +# Library.nsh +# +# A system for the installation and uninstallation of dynamic +# link libraries (DLL) and type libraries (TLB). Using this +# system you can handle the complete setup with one single +# line of code: +# +# * File copying +# * File copying on reboot +# * Version checks +# * Registration and unregistration +# * Registration and unregistration on reboot +# * Shared DLL counting +# * Windows File Protection checks +# +# For more information, read appendix B in the documentation. +# !ifndef LIB_INCLUDED @@ -160,10 +28,81 @@ Example: !define SHCNF_IDLIST 0x0000 !endif +Var __INSTALLLLIB_SESSIONGUID + +### Initialize session id (GUID) +!macro __InstallLib_Helper_InitSession + + StrCmp $__INSTALLLLIB_SESSIONGUID '' 0 +6 + + System::Alloc 16 + System::Call 'ole32::CoCreateGuid(i sR0)' + System::Call 'ole32::StringFromGUID2(i R0, w .s, i ${NSIS_MAX_STRLEN})' + System::Free $R0 + Pop $__INSTALLLLIB_SESSIONGUID + + StrCmp $__INSTALLLLIB_SESSIONGUID '' 0 +2 + StrCpy $__INSTALLLLIB_SESSIONGUID 'session' + +!macroend + +### Add a RegTool entry to register after reboot +!macro __InstallLib_Helper_AddRegToolEntry mode filename tempdir + + Push $R0 + Push $R1 + Push $R2 + Push $R3 + + ;------------------------ + ;Copy the parameters + + Push "${filename}" + Push "${tempdir}" + + Pop $R2 ; temporary directory + Pop $R1 ; file name to register + + ;------------------------ + ;Initialize session id + + !insertmacro __InstallLib_Helper_InitSession + + ;------------------------ + ;Advance counter + + StrCpy $R0 0 + ReadRegDWORD $R0 HKLM "Software\NSIS.Library.RegTool.v2\$__INSTALLLLIB_SESSIONGUID" "count" + IntOp $R0 $R0 + 1 + WriteRegDWORD HKLM "Software\NSIS.Library.RegTool.v2\$__INSTALLLLIB_SESSIONGUID" "count" "$R0" + + ;------------------------ + ;Setup RegTool + + ReadRegStr $R3 HKLM "Software\Microsoft\Windows\CurrentVersion\RunOnce" "NSIS.Library.RegTool.v2" + IfFileExists $R3 +3 + + File /oname=$R2\NSIS.Library.RegTool.v2.exe "${NSISDIR}\Bin\RegTool.bin" + WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\RunOnce" \ + "NSIS.Library.RegTool.v2" '"$R2\NSIS.Library.RegTool.v2.exe" /S' + + ;------------------------ + ;Add RegTool entry + + WriteRegStr HKLM "Software\NSIS.Library.RegTool.v2\$__INSTALLLLIB_SESSIONGUID" "$R0.file" "$R1" + WriteRegStr HKLM "Software\NSIS.Library.RegTool.v2\$__INSTALLLLIB_SESSIONGUID" "$R0.mode" "${mode}" + + Pop $R2 + Pop $R1 + Pop $R0 + +!macroend + +### Install library !macro InstallLib libtype shared install localfile destfile tempbasedir !verbose push - !verbose 3 + #!verbose 3 Push $R0 Push $R1 @@ -402,36 +341,7 @@ Example: ;------------------------ ;Register on reboot - !ifdef INSTALLLIB_LIBTYPE_REGDLL | INSTALLLIB_LIBTYPE_TLB | INSTALLLIB_LIBTYPE_REGDLLTLB - - ReadRegStr $R0 HKLM "Software\Microsoft\Windows\CurrentVersion\RunOnce" "NSIS.Library.RegTool" - IfFileExists $R0 installlib.rebootreg_${INSTALLLIB_UNIQUE} - - File /oname=$R5\NSIS.Library.RegTool.exe "${NSISDIR}\Bin\RegTool.bin" - WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\RunOnce" \ - "NSIS.Library.RegTool" '"$R5\NSIS.Library.RegTool.exe"' - - installlib.rebootreg_${INSTALLLIB_UNIQUE}: - - !endif - - !ifdef INSTALLLIB_LIBTYPE_REGDLL - - WriteRegStr HKLM "Software\NSIS.Library.RegTool" "$R4" 'D' - - !endif - - !ifdef INSTALLLIB_LIBTYPE_TLB - - WriteRegStr HKLM "Software\NSIS.Library.RegTool" "$R4" 'T' - - !endif - - !ifdef INSTALLLIB_LIBTYPE_REGDLLTLB - - WriteRegStr HKLM "Software\NSIS.Library.RegTool" "$R4" 'DT' - - !endif + Call :installlib.regonreboot_${INSTALLLIB_UNIQUE} Goto installlib.done_${INSTALLLIB_UNIQUE} @@ -452,15 +362,37 @@ Example: !endif - !ifdef INSTALLLIB_LIBTYPE_REGDLL | INSTALLLIB_LIBTYPE_REGDLLTLB + !ifdef INSTALLLIB_LIBTYPE_REGDLL | INSTALLLIB_LIBTYPE_TLB | INSTALLLIB_LIBTYPE_REGDLLTLB - RegDLL $R4 + !ifdef INSTALLLIB_INSTALL_REBOOT_PROTECTED | INSTALLLIB_INSTALL_REBOOT_NOTPROTECTED - !endif + IfRebootFlag 0 installlib.regnoreboot_${INSTALLLIB_UNIQUE} - !ifdef INSTALLLIB_LIBTYPE_TLB | INSTALLLIB_LIBTYPE_REGDLLTLB + Call :installlib.regonreboot_${INSTALLLIB_UNIQUE} - TypeLib::Register $R4 + Goto installlib.registerfinish_${INSTALLLIB_UNIQUE} + + installlib.regnoreboot_${INSTALLLIB_UNIQUE}: + + !endif + + !ifdef INSTALLLIB_LIBTYPE_TLB | INSTALLLIB_LIBTYPE_REGDLLTLB + + TypeLib::Register $R4 + + !endif + + !ifdef INSTALLLIB_LIBTYPE_REGDLL | INSTALLLIB_LIBTYPE_REGDLLTLB + + RegDll $R4 + + !endif + + !ifdef INSTALLLIB_INSTALL_REBOOT_PROTECTED | INSTALLLIB_INSTALL_REBOOT_NOTPROTECTED + + installlib.registerfinish_${INSTALLLIB_UNIQUE}: + + !endif !endif @@ -483,7 +415,7 @@ Example: !undef LIBRARY_DEFINE_DONE_LABEL - installlib.done_${INSTALLLIB_UNIQUE}: + installlib.done_${INSTALLLIB_UNIQUE}: !endif @@ -528,6 +460,30 @@ Example: !endif + ;------------------------ + ;Register on reboot + + !ifdef INSTALLLIB_INSTALL_REBOOT_PROTECTED | INSTALLLIB_INSTALL_REBOOT_NOTPROTECTED + + installlib.regonreboot_${INSTALLLIB_UNIQUE}: + + !ifdef INSTALLLIB_LIBTYPE_REGDLL + !insertmacro __InstallLib_Helper_AddRegToolEntry 'D' "$R4" "$R5" + !endif + + !ifdef INSTALLLIB_LIBTYPE_TLB + !insertmacro __InstallLib_Helper_AddRegToolEntry 'T' "$R4" "$R5" + !endif + + !ifdef INSTALLLIB_LIBTYPE_REGDLLTLB + !insertmacro __InstallLib_Helper_AddRegToolEntry 'D' "$R4" "$R5" + !insertmacro __InstallLib_Helper_AddRegToolEntry 'T' "$R4" "$R5" + !endif + + Return + + !endif + ;------------------------ ;Undefine @@ -544,6 +500,7 @@ Example: !macroend +### Uninstall library !macro UnInstallLib libtype shared uninstall file !verbose push