root / tmp / org.txm.setups / nsis-2.5 / Include / Library.nsh @ 3100
Historique | Voir | Annoter | Télécharger (20,31 ko)
1 |
# |
---|---|
2 |
# Library.nsh |
3 |
# |
4 |
# A system for the installation and uninstallation of dynamic |
5 |
# link libraries (DLL) and type libraries (TLB). Using this |
6 |
# system you can handle the complete setup with one single |
7 |
# line of code: |
8 |
# |
9 |
# * File copying |
10 |
# * File copying on reboot |
11 |
# * Version checks |
12 |
# * Registration and unregistration |
13 |
# * Registration and unregistration on reboot |
14 |
# * Shared DLL counting |
15 |
# * Windows File Protection checks |
16 |
# |
17 |
# For more information, read appendix B in the documentation. |
18 |
# |
19 |
|
20 |
!verbose push |
21 |
!verbose 3 |
22 |
|
23 |
!ifndef LIB_INCLUDED |
24 |
|
25 |
!define LIB_INCLUDED |
26 |
|
27 |
!ifndef SHCNE_ASSOCCHANGED |
28 |
!define SHCNE_ASSOCCHANGED 0x08000000 |
29 |
!endif |
30 |
!ifndef SHCNF_IDLIST |
31 |
!define SHCNF_IDLIST 0x0000 |
32 |
!endif |
33 |
|
34 |
!define REGTOOL_VERSION v3 |
35 |
!define REGTOOL_KEY NSIS.Library.RegTool.${REGTOOL_VERSION} |
36 |
|
37 |
!include LogicLib.nsh |
38 |
!include x64.nsh |
39 |
|
40 |
### GetParent macro, don't pass $1 or $2 as INTPUT or OUTPUT |
41 |
!macro __InstallLib_Helper_GetParent INPUT OUTPUT |
42 |
|
43 |
# Copied from FileFunc.nsh |
44 |
|
45 |
StrCpy ${OUTPUT} ${INPUT} |
46 |
|
47 |
Push $1 |
48 |
Push $2 |
49 |
|
50 |
StrCpy $2 ${OUTPUT} 1 -1 |
51 |
StrCmp $2 '\' 0 +3 |
52 |
StrCpy ${OUTPUT} ${OUTPUT} -1 |
53 |
goto -3 |
54 |
|
55 |
StrCpy $1 0 |
56 |
IntOp $1 $1 - 1 |
57 |
StrCpy $2 ${OUTPUT} 1 $1 |
58 |
StrCmp $2 '\' +2 |
59 |
StrCmp $2 '' 0 -3 |
60 |
StrCpy ${OUTPUT} ${OUTPUT} $1 |
61 |
|
62 |
Pop $2 |
63 |
Pop $1 |
64 |
|
65 |
!macroend |
66 |
|
67 |
### Initialize session id (GUID) |
68 |
!macro __InstallLib_Helper_InitSession |
69 |
|
70 |
!ifndef __InstallLib_SessionGUID_Defined |
71 |
|
72 |
!define __InstallLib_SessionGUID_Defined |
73 |
|
74 |
Var /GLOBAL __INSTALLLLIB_SESSIONGUID |
75 |
|
76 |
!endif |
77 |
|
78 |
!define __InstallLib_Helper_InitSession_Label "Library_${__FILE__}${__LINE__}" |
79 |
|
80 |
StrCmp $__INSTALLLLIB_SESSIONGUID '' 0 "${__InstallLib_Helper_InitSession_Label}" |
81 |
|
82 |
System::Call 'ole32::CoCreateGuid(g .s)' |
83 |
Pop $__INSTALLLLIB_SESSIONGUID |
84 |
|
85 |
"${__InstallLib_Helper_InitSession_Label}:" |
86 |
|
87 |
!undef __InstallLib_Helper_InitSession_Label |
88 |
|
89 |
!macroend |
90 |
|
91 |
### Add a RegTool entry to register after reboot |
92 |
!macro __InstallLib_Helper_AddRegToolEntry mode filename tempdir |
93 |
|
94 |
Push $R0 |
95 |
Push $R1 |
96 |
Push $R2 |
97 |
Push $R3 |
98 |
|
99 |
;------------------------ |
100 |
;Copy the parameters |
101 |
|
102 |
Push "${filename}" |
103 |
Push "${tempdir}" |
104 |
|
105 |
Pop $R2 ; temporary directory |
106 |
Pop $R1 ; file name to register |
107 |
|
108 |
;------------------------ |
109 |
;Initialize session id |
110 |
|
111 |
!insertmacro __InstallLib_Helper_InitSession |
112 |
|
113 |
;------------------------ |
114 |
;Advance counter |
115 |
|
116 |
StrCpy $R0 0 |
117 |
ReadRegDWORD $R0 HKLM "Software\${REGTOOL_KEY}\$__INSTALLLLIB_SESSIONGUID" "count" |
118 |
IntOp $R0 $R0 + 1 |
119 |
WriteRegDWORD HKLM "Software\${REGTOOL_KEY}\$__INSTALLLLIB_SESSIONGUID" "count" "$R0" |
120 |
|
121 |
;------------------------ |
122 |
;Setup RegTool |
123 |
|
124 |
ReadRegStr $R3 HKLM "Software\Microsoft\Windows\CurrentVersion\RunOnce" "${REGTOOL_KEY}" |
125 |
StrCpy $R3 $R3 -4 1 |
126 |
IfFileExists $R3 +3 |
127 |
|
128 |
File /oname=$R2\${REGTOOL_KEY}.$__INSTALLLLIB_SESSIONGUID.exe "${NSISDIR}\Bin\RegTool.bin" |
129 |
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\RunOnce" \ |
130 |
"${REGTOOL_KEY}" '"$R2\${REGTOOL_KEY}.$__INSTALLLLIB_SESSIONGUID.exe" /S' |
131 |
|
132 |
;------------------------ |
133 |
;Add RegTool entry |
134 |
|
135 |
WriteRegStr HKLM "Software\${REGTOOL_KEY}\$__INSTALLLLIB_SESSIONGUID" "$R0.file" "$R1" |
136 |
WriteRegStr HKLM "Software\${REGTOOL_KEY}\$__INSTALLLLIB_SESSIONGUID" "$R0.mode" "${mode}" |
137 |
|
138 |
Pop $R3 |
139 |
Pop $R2 |
140 |
Pop $R1 |
141 |
Pop $R0 |
142 |
|
143 |
!macroend |
144 |
|
145 |
### Get library version |
146 |
!macro __InstallLib_Helper_GetVersion TYPE FILE |
147 |
|
148 |
!tempfile LIBRARY_TEMP_NSH |
149 |
|
150 |
!ifdef NSIS_WIN32_MAKENSIS |
151 |
|
152 |
!execute '"${NSISDIR}\Bin\LibraryLocal.exe" "${TYPE}" "${FILE}" "${LIBRARY_TEMP_NSH}"' |
153 |
|
154 |
!else |
155 |
|
156 |
!execute 'LibraryLocal "${TYPE}" "${FILE}" "${LIBRARY_TEMP_NSH}"' |
157 |
|
158 |
!if ${TYPE} == 'T' |
159 |
|
160 |
!warning "LibraryLocal currently supports TypeLibs version detection on Windows only" |
161 |
|
162 |
!endif |
163 |
|
164 |
!endif |
165 |
|
166 |
!include "${LIBRARY_TEMP_NSH}" |
167 |
!delfile "${LIBRARY_TEMP_NSH}" |
168 |
!undef LIBRARY_TEMP_NSH |
169 |
|
170 |
!macroend |
171 |
|
172 |
### Install library |
173 |
!macro InstallLib libtype shared install localfile destfile tempbasedir |
174 |
|
175 |
!verbose push |
176 |
!verbose 3 |
177 |
|
178 |
Push $R0 |
179 |
Push $R1 |
180 |
Push $R2 |
181 |
Push $R3 |
182 |
Push $R4 |
183 |
Push $R5 |
184 |
|
185 |
;------------------------ |
186 |
;Define |
187 |
|
188 |
!define INSTALLLIB_UNIQUE "${__FILE__}${__LINE__}" |
189 |
|
190 |
!define INSTALLLIB_LIBTYPE_${libtype} |
191 |
!define INSTALLLIB_LIBTYPE_SET INSTALLLIB_LIBTYPE_${libtype} |
192 |
!define INSTALLLIB_SHARED_${shared} |
193 |
!define INSTALLLIB_SHARED_SET INSTALLLIB_SHARED_${shared} |
194 |
!define INSTALLLIB_INSTALL_${install} |
195 |
!define INSTALLLIB_INSTALL_SET INSTALLLIB_INSTALL_${install} |
196 |
|
197 |
;------------------------ |
198 |
;Validate |
199 |
|
200 |
!ifndef INSTALLLIB_LIBTYPE_DLL & INSTALLLIB_LIBTYPE_REGDLL & INSTALLLIB_LIBTYPE_TLB & \ |
201 |
INSTALLLIB_LIBTYPE_REGDLLTLB & INSTALLLIB_LIBTYPE_REGEXE |
202 |
!error "InstallLib: Incorrect setting for parameter: libtype" |
203 |
!endif |
204 |
|
205 |
!ifndef INSTALLLIB_INSTALL_REBOOT_PROTECTED & INSTALLLIB_INSTALL_REBOOT_NOTPROTECTED & \ |
206 |
INSTALLLIB_INSTALL_NOREBOOT_PROTECTED & INSTALLLIB_INSTALL_NOREBOOT_NOTPROTECTED |
207 |
!error "InstallLib: Incorrect setting for parameter: install" |
208 |
!endif |
209 |
|
210 |
;------------------------ |
211 |
;x64 settings |
212 |
|
213 |
!ifdef LIBRARY_X64 |
214 |
|
215 |
${DisableX64FSRedirection} |
216 |
|
217 |
!endif |
218 |
|
219 |
;------------------------ |
220 |
;Copy the parameters used on run-time to a variable |
221 |
;This allows the usage of variables as parameter |
222 |
|
223 |
StrCpy $R4 "${destfile}" |
224 |
StrCpy $R5 "${tempbasedir}" |
225 |
|
226 |
;------------------------ |
227 |
;Shared library count |
228 |
|
229 |
!ifndef INSTALLLIB_SHARED_NOTSHARED |
230 |
|
231 |
StrCmp ${shared} "" 0 "installlib.noshareddllincrease_${INSTALLLIB_UNIQUE}" |
232 |
|
233 |
!ifdef LIBRARY_X64 |
234 |
|
235 |
SetRegView 64 |
236 |
|
237 |
!endif |
238 |
|
239 |
ReadRegDword $R0 HKLM Software\Microsoft\Windows\CurrentVersion\SharedDLLs $R4 |
240 |
ClearErrors |
241 |
IntOp $R0 $R0 + 1 |
242 |
WriteRegDWORD HKLM Software\Microsoft\Windows\CurrentVersion\SharedDLLs $R4 $R0 |
243 |
|
244 |
!ifdef LIBRARY_X64 |
245 |
|
246 |
SetRegView lastused |
247 |
|
248 |
!endif |
249 |
|
250 |
"installlib.noshareddllincrease_${INSTALLLIB_UNIQUE}:" |
251 |
|
252 |
!endif |
253 |
|
254 |
;------------------------ |
255 |
;Check Windows File Protection |
256 |
|
257 |
!ifdef INSTALLLIB_INSTALL_REBOOT_PROTECTED | INSTALLLIB_INSTALL_NOREBOOT_PROTECTED |
258 |
|
259 |
!define LIBRARY_DEFINE_DONE_LABEL |
260 |
|
261 |
System::Call "sfc::SfcIsFileProtected(i 0, w R4) i.R0" |
262 |
|
263 |
StrCmp $R0 "error" "installlib.notprotected_${INSTALLLIB_UNIQUE}" |
264 |
StrCmp $R0 "0" "installlib.notprotected_${INSTALLLIB_UNIQUE}" |
265 |
|
266 |
Goto "installlib.done_${INSTALLLIB_UNIQUE}" |
267 |
|
268 |
"installlib.notprotected_${INSTALLLIB_UNIQUE}:" |
269 |
|
270 |
!endif |
271 |
|
272 |
;------------------------ |
273 |
;Check file |
274 |
|
275 |
IfFileExists $R4 0 "installlib.copy_${INSTALLLIB_UNIQUE}" |
276 |
|
277 |
;------------------------ |
278 |
;Get version information |
279 |
|
280 |
!ifndef LIBRARY_IGNORE_VERSION |
281 |
|
282 |
!insertmacro __InstallLib_Helper_GetVersion D "${LOCALFILE}" |
283 |
|
284 |
!ifdef LIBRARY_VERSION_FILENOTFOUND |
285 |
!error "InstallLib: The library ${LOCALFILE} could not be found." |
286 |
!endif |
287 |
|
288 |
!ifndef LIBRARY_VERSION_NONE |
289 |
|
290 |
!define LIBRARY_DEFINE_UPGRADE_LABEL |
291 |
!define LIBRARY_DEFINE_REGISTER_LABEL |
292 |
|
293 |
StrCpy $R0 ${LIBRARY_VERSION_HIGH} |
294 |
StrCpy $R1 ${LIBRARY_VERSION_LOW} |
295 |
|
296 |
GetDLLVersion $R4 $R2 $R3 |
297 |
|
298 |
!undef LIBRARY_VERSION_HIGH |
299 |
!undef LIBRARY_VERSION_LOW |
300 |
|
301 |
!ifndef INSTALLLIB_LIBTYPE_TLB & INSTALLLIB_LIBTYPE_REGDLLTLB |
302 |
|
303 |
IntCmpU $R0 $R2 0 "installlib.register_${INSTALLLIB_UNIQUE}" "installlib.upgrade_${INSTALLLIB_UNIQUE}" |
304 |
IntCmpU $R1 $R3 "installlib.register_${INSTALLLIB_UNIQUE}" "installlib.register_${INSTALLLIB_UNIQUE}" \ |
305 |
"installlib.upgrade_${INSTALLLIB_UNIQUE}" |
306 |
|
307 |
!else |
308 |
|
309 |
!insertmacro __InstallLib_Helper_GetVersion T "${LOCALFILE}" |
310 |
|
311 |
!ifdef LIBRARY_VERSION_FILENOTFOUND |
312 |
!error "InstallLib: The library ${LOCALFILE} could not be found." |
313 |
!endif |
314 |
|
315 |
!ifndef LIBRARY_VERSION_NONE |
316 |
|
317 |
IntCmpU $R0 $R2 0 "installlib.register_${INSTALLLIB_UNIQUE}" "installlib.upgrade_${INSTALLLIB_UNIQUE}" |
318 |
IntCmpU $R1 $R3 0 "installlib.register_${INSTALLLIB_UNIQUE}" \ |
319 |
"installlib.upgrade_${INSTALLLIB_UNIQUE}" |
320 |
|
321 |
!else |
322 |
|
323 |
IntCmpU $R0 $R2 0 "installlib.register_${INSTALLLIB_UNIQUE}" "installlib.upgrade_${INSTALLLIB_UNIQUE}" |
324 |
IntCmpU $R1 $R3 "installlib.register_${INSTALLLIB_UNIQUE}" "installlib.register_${INSTALLLIB_UNIQUE}" \ |
325 |
"installlib.upgrade_${INSTALLLIB_UNIQUE}" |
326 |
|
327 |
!endif |
328 |
|
329 |
!endif |
330 |
|
331 |
!else |
332 |
|
333 |
!undef LIBRARY_VERSION_NONE |
334 |
|
335 |
!ifdef INSTALLLIB_LIBTYPE_TLB | INSTALLLIB_LIBTYPE_REGDLLTLB |
336 |
|
337 |
!insertmacro __InstallLib_Helper_GetVersion T "${LOCALFILE}" |
338 |
|
339 |
!endif |
340 |
|
341 |
!endif |
342 |
|
343 |
!ifdef INSTALLLIB_LIBTYPE_TLB | INSTALLLIB_LIBTYPE_REGDLLTLB |
344 |
|
345 |
!ifndef LIBRARY_VERSION_NONE |
346 |
|
347 |
!ifndef LIBRARY_DEFINE_UPGRADE_LABEL |
348 |
|
349 |
!define LIBRARY_DEFINE_UPGRADE_LABEL |
350 |
|
351 |
!endif |
352 |
|
353 |
!ifndef LIBRARY_DEFINE_REGISTER_LABEL |
354 |
|
355 |
!define LIBRARY_DEFINE_REGISTER_LABEL |
356 |
|
357 |
!endif |
358 |
|
359 |
StrCpy $R0 ${LIBRARY_VERSION_HIGH} |
360 |
StrCpy $R1 ${LIBRARY_VERSION_LOW} |
361 |
|
362 |
TypeLib::GetLibVersion $R4 |
363 |
Pop $R3 |
364 |
Pop $R2 |
365 |
|
366 |
IntCmpU $R0 $R2 0 "installlib.register_${INSTALLLIB_UNIQUE}" "installlib.upgrade_${INSTALLLIB_UNIQUE}" |
367 |
IntCmpU $R1 $R3 "installlib.register_${INSTALLLIB_UNIQUE}" "installlib.register_${INSTALLLIB_UNIQUE}" \ |
368 |
"installlib.upgrade_${INSTALLLIB_UNIQUE}" |
369 |
|
370 |
!undef LIBRARY_VERSION_HIGH |
371 |
!undef LIBRARY_VERSION_LOW |
372 |
|
373 |
!else |
374 |
|
375 |
!undef LIBRARY_VERSION_NONE |
376 |
|
377 |
!endif |
378 |
|
379 |
!endif |
380 |
|
381 |
!endif |
382 |
|
383 |
;------------------------ |
384 |
;Upgrade |
385 |
|
386 |
!ifdef LIBRARY_DEFINE_UPGRADE_LABEL |
387 |
|
388 |
!undef LIBRARY_DEFINE_UPGRADE_LABEL |
389 |
|
390 |
"installlib.upgrade_${INSTALLLIB_UNIQUE}:" |
391 |
|
392 |
!endif |
393 |
|
394 |
;------------------------ |
395 |
;Copy |
396 |
|
397 |
!ifdef INSTALLLIB_INSTALL_NOREBOOT_PROTECTED | INSTALLLIB_INSTALL_NOREBOOT_NOTPROTECTED |
398 |
|
399 |
"installlib.copy_${INSTALLLIB_UNIQUE}:" |
400 |
|
401 |
StrCpy $R0 $R4 |
402 |
Call ":installlib.file_${INSTALLLIB_UNIQUE}" |
403 |
|
404 |
!else |
405 |
|
406 |
!ifndef LIBRARY_DEFINE_REGISTER_LABEL |
407 |
|
408 |
!define LIBRARY_DEFINE_REGISTER_LABEL |
409 |
|
410 |
!endif |
411 |
|
412 |
!ifndef LIBRARY_DEFINE_DONE_LABEL |
413 |
|
414 |
!define LIBRARY_DEFINE_DONE_LABEL |
415 |
|
416 |
!endif |
417 |
|
418 |
ClearErrors |
419 |
|
420 |
StrCpy $R0 $R4 |
421 |
Call ":installlib.file_${INSTALLLIB_UNIQUE}" |
422 |
|
423 |
IfErrors 0 "installlib.register_${INSTALLLIB_UNIQUE}" |
424 |
|
425 |
SetOverwrite lastused |
426 |
|
427 |
;------------------------ |
428 |
;Copy on reboot |
429 |
|
430 |
GetTempFileName $R0 $R5 |
431 |
Call ":installlib.file_${INSTALLLIB_UNIQUE}" |
432 |
Rename /REBOOTOK $R0 $R4 |
433 |
|
434 |
;------------------------ |
435 |
;Register on reboot |
436 |
|
437 |
Call ":installlib.regonreboot_${INSTALLLIB_UNIQUE}" |
438 |
|
439 |
Goto "installlib.done_${INSTALLLIB_UNIQUE}" |
440 |
|
441 |
"installlib.copy_${INSTALLLIB_UNIQUE}:" |
442 |
StrCpy $R0 $R4 |
443 |
Call ":installlib.file_${INSTALLLIB_UNIQUE}" |
444 |
|
445 |
!endif |
446 |
|
447 |
;------------------------ |
448 |
;Register |
449 |
|
450 |
!ifdef LIBRARY_DEFINE_REGISTER_LABEL |
451 |
|
452 |
!undef LIBRARY_DEFINE_REGISTER_LABEL |
453 |
|
454 |
"installlib.register_${INSTALLLIB_UNIQUE}:" |
455 |
|
456 |
!endif |
457 |
|
458 |
!ifdef INSTALLLIB_LIBTYPE_REGDLL | INSTALLLIB_LIBTYPE_TLB | INSTALLLIB_LIBTYPE_REGDLLTLB | INSTALLLIB_LIBTYPE_REGEXE |
459 |
|
460 |
!ifdef INSTALLLIB_INSTALL_REBOOT_PROTECTED | INSTALLLIB_INSTALL_REBOOT_NOTPROTECTED |
461 |
|
462 |
IfRebootFlag 0 "installlib.regnoreboot_${INSTALLLIB_UNIQUE}" |
463 |
|
464 |
Call ":installlib.regonreboot_${INSTALLLIB_UNIQUE}" |
465 |
|
466 |
Goto "installlib.registerfinish_${INSTALLLIB_UNIQUE}" |
467 |
|
468 |
"installlib.regnoreboot_${INSTALLLIB_UNIQUE}:" |
469 |
|
470 |
!endif |
471 |
|
472 |
!ifdef INSTALLLIB_LIBTYPE_TLB | INSTALLLIB_LIBTYPE_REGDLLTLB |
473 |
|
474 |
TypeLib::Register $R4 |
475 |
|
476 |
!endif |
477 |
|
478 |
!ifdef INSTALLLIB_LIBTYPE_REGDLL | INSTALLLIB_LIBTYPE_REGDLLTLB |
479 |
|
480 |
!ifndef LIBRARY_X64 |
481 |
|
482 |
RegDll $R4 |
483 |
|
484 |
!else |
485 |
|
486 |
ExecWait '"$SYSDIR\regsvr32.exe" /s "$R4"' |
487 |
|
488 |
!endif |
489 |
|
490 |
!endif |
491 |
|
492 |
!ifdef INSTALLLIB_LIBTYPE_REGEXE |
493 |
|
494 |
ExecWait '"$R4" /regserver' |
495 |
|
496 |
!endif |
497 |
|
498 |
!ifdef INSTALLLIB_INSTALL_REBOOT_PROTECTED | INSTALLLIB_INSTALL_REBOOT_NOTPROTECTED |
499 |
|
500 |
"installlib.registerfinish_${INSTALLLIB_UNIQUE}:" |
501 |
|
502 |
!endif |
503 |
|
504 |
!endif |
505 |
|
506 |
!ifdef LIBRARY_SHELL_EXTENSION |
507 |
|
508 |
System::Call 'Shell32::SHChangeNotify(i ${SHCNE_ASSOCCHANGED}, i ${SHCNF_IDLIST}, i 0, i 0)' |
509 |
|
510 |
!endif |
511 |
|
512 |
!ifdef LIBRARY_COM |
513 |
|
514 |
System::Call 'Ole32::CoFreeUnusedLibraries()' |
515 |
|
516 |
!endif |
517 |
|
518 |
;------------------------ |
519 |
;Done |
520 |
|
521 |
!ifdef LIBRARY_DEFINE_DONE_LABEL |
522 |
|
523 |
!undef LIBRARY_DEFINE_DONE_LABEL |
524 |
|
525 |
"installlib.done_${INSTALLLIB_UNIQUE}:" |
526 |
|
527 |
!endif |
528 |
|
529 |
Pop $R5 |
530 |
Pop $R4 |
531 |
Pop $R3 |
532 |
Pop $R2 |
533 |
Pop $R1 |
534 |
Pop $R0 |
535 |
|
536 |
;------------------------ |
537 |
;End |
538 |
|
539 |
Goto "installlib.end_${INSTALLLIB_UNIQUE}" |
540 |
|
541 |
;------------------------ |
542 |
;Extract |
543 |
|
544 |
!ifdef INSTALLLIB_INSTALL_REBOOT_PROTECTED | INSTALLLIB_INSTALL_REBOOT_NOTPROTECTED |
545 |
|
546 |
SetOverwrite try |
547 |
|
548 |
!else |
549 |
|
550 |
SetOverwrite on |
551 |
|
552 |
!endif |
553 |
|
554 |
"installlib.file_${INSTALLLIB_UNIQUE}:" |
555 |
SetFileAttributes $R0 FILE_ATTRIBUTE_NORMAL |
556 |
ClearErrors |
557 |
File /oname=$R0 "${LOCALFILE}" |
558 |
Return |
559 |
|
560 |
SetOverwrite lastused |
561 |
|
562 |
;------------------------ |
563 |
;Register on reboot |
564 |
|
565 |
!ifdef INSTALLLIB_INSTALL_REBOOT_PROTECTED | INSTALLLIB_INSTALL_REBOOT_NOTPROTECTED |
566 |
|
567 |
"installlib.regonreboot_${INSTALLLIB_UNIQUE}:" |
568 |
|
569 |
!ifdef INSTALLLIB_LIBTYPE_REGDLL | INSTALLLIB_LIBTYPE_REGDLLTLB |
570 |
!ifndef LIBRARY_X64 |
571 |
!insertmacro __InstallLib_Helper_AddRegToolEntry 'D' "$R4" "$R5" |
572 |
!else |
573 |
!insertmacro __InstallLib_Helper_AddRegToolEntry 'DX' "$R4" "$R5" |
574 |
!endif |
575 |
!endif |
576 |
|
577 |
!ifdef INSTALLLIB_LIBTYPE_TLB | INSTALLLIB_LIBTYPE_REGDLLTLB |
578 |
!insertmacro __InstallLib_Helper_AddRegToolEntry 'T' "$R4" "$R5" |
579 |
!endif |
580 |
|
581 |
!ifdef INSTALLLIB_LIBTYPE_REGEXE |
582 |
!insertmacro __InstallLib_Helper_AddRegToolEntry 'E' "$R4" "$R5" |
583 |
!endif |
584 |
|
585 |
Return |
586 |
|
587 |
!endif |
588 |
|
589 |
;------------------------ |
590 |
;End label |
591 |
|
592 |
"installlib.end_${INSTALLLIB_UNIQUE}:" |
593 |
|
594 |
!ifdef LIBRARY_X64 |
595 |
|
596 |
${EnableX64FSRedirection} |
597 |
|
598 |
!endif |
599 |
|
600 |
;------------------------ |
601 |
;Undefine |
602 |
|
603 |
!undef INSTALLLIB_UNIQUE |
604 |
|
605 |
!undef ${INSTALLLIB_LIBTYPE_SET} |
606 |
!undef INSTALLLIB_LIBTYPE_SET |
607 |
!undef ${INSTALLLIB_SHARED_SET} |
608 |
!undef INSTALLLIB_SHARED_SET |
609 |
!undef ${INSTALLLIB_INSTALL_SET} |
610 |
!undef INSTALLLIB_INSTALL_SET |
611 |
|
612 |
!verbose pop |
613 |
|
614 |
!macroend |
615 |
|
616 |
### Uninstall library |
617 |
!macro UnInstallLib libtype shared uninstall file |
618 |
|
619 |
!verbose push |
620 |
!verbose 3 |
621 |
|
622 |
Push $R0 |
623 |
Push $R1 |
624 |
|
625 |
;------------------------ |
626 |
;Define |
627 |
|
628 |
!define UNINSTALLLIB_UNIQUE "${__FILE__}${__LINE__}" |
629 |
|
630 |
!define UNINSTALLLIB_LIBTYPE_${libtype} |
631 |
!define UNINSTALLLIB_LIBTYPE_SET UNINSTALLLIB_LIBTYPE_${libtype} |
632 |
!define UNINSTALLLIB_SHARED_${shared} |
633 |
!define UNINSTALLLIB_SHARED_SET UNINSTALLLIB_SHARED_${shared} |
634 |
!define UNINSTALLLIB_UNINSTALL_${uninstall} |
635 |
!define UNINSTALLLIB_UNINSTALL_SET UNINSTALLLIB_UNINSTALL_${uninstall} |
636 |
|
637 |
;------------------------ |
638 |
;Validate |
639 |
|
640 |
!ifndef UNINSTALLLIB_LIBTYPE_DLL & UNINSTALLLIB_LIBTYPE_REGDLL & UNINSTALLLIB_LIBTYPE_TLB & \ |
641 |
UNINSTALLLIB_LIBTYPE_REGDLLTLB & UNINSTALLLIB_LIBTYPE_REGEXE |
642 |
!error "UnInstallLib: Incorrect setting for parameter: libtype" |
643 |
!endif |
644 |
|
645 |
!ifndef UNINSTALLLIB_SHARED_NOTSHARED & UNINSTALLLIB_SHARED_SHARED |
646 |
!error "UnInstallLib: Incorrect setting for parameter: shared" |
647 |
!endif |
648 |
|
649 |
!ifndef UNINSTALLLIB_UNINSTALL_NOREMOVE & UNINSTALLLIB_UNINSTALL_REBOOT_PROTECTED & \ |
650 |
UNINSTALLLIB_UNINSTALL_REBOOT_NOTPROTECTED & UNINSTALLLIB_UNINSTALL_NOREBOOT_PROTECTED & \ |
651 |
UNINSTALLLIB_UNINSTALL_NOREBOOT_NOTPROTECTED |
652 |
!error "UnInstallLib: Incorrect setting for parameter: uninstall" |
653 |
!endif |
654 |
|
655 |
;------------------------ |
656 |
;x64 settings |
657 |
|
658 |
!ifdef LIBRARY_X64 |
659 |
|
660 |
${DisableX64FSRedirection} |
661 |
|
662 |
!endif |
663 |
|
664 |
;------------------------ |
665 |
;Copy the parameters used on run-time to a variable |
666 |
;This allows the usage of variables as parameter |
667 |
|
668 |
StrCpy $R1 "${file}" |
669 |
|
670 |
;------------------------ |
671 |
;Shared library count |
672 |
|
673 |
!ifdef UNINSTALLLIB_SHARED_SHARED |
674 |
|
675 |
!define UNINSTALLLIB_DONE_LABEL |
676 |
|
677 |
!ifdef LIBRARY_X64 |
678 |
|
679 |
SetRegView 64 |
680 |
|
681 |
!endif |
682 |
|
683 |
ReadRegDword $R0 HKLM Software\Microsoft\Windows\CurrentVersion\SharedDLLs $R1 |
684 |
StrCmp $R0 "" "uninstalllib.shareddlldone_${UNINSTALLLIB_UNIQUE}" |
685 |
|
686 |
IntOp $R0 $R0 - 1 |
687 |
IntCmp $R0 0 "uninstalllib.shareddllremove_${UNINSTALLLIB_UNIQUE}" \ |
688 |
"uninstalllib.shareddllremove_${UNINSTALLLIB_UNIQUE}" "uninstalllib.shareddllinuse_${UNINSTALLLIB_UNIQUE}" |
689 |
|
690 |
"uninstalllib.shareddllremove_${UNINSTALLLIB_UNIQUE}:" |
691 |
DeleteRegValue HKLM Software\Microsoft\Windows\CurrentVersion\SharedDLLs $R1 |
692 |
!ifndef UNINSTALLLIB_SHARED_SHAREDNOREMOVE |
693 |
Goto "uninstalllib.shareddlldone_${UNINSTALLLIB_UNIQUE}" |
694 |
!endif |
695 |
|
696 |
"uninstalllib.shareddllinuse_${UNINSTALLLIB_UNIQUE}:" |
697 |
WriteRegDWORD HKLM Software\Microsoft\Windows\CurrentVersion\SharedDLLs $R1 $R0 |
698 |
|
699 |
!ifdef LIBRARY_X64 |
700 |
|
701 |
SetRegView lastused |
702 |
|
703 |
!endif |
704 |
|
705 |
Goto "uninstalllib.done_${UNINSTALLLIB_UNIQUE}" |
706 |
|
707 |
"uninstalllib.shareddlldone_${UNINSTALLLIB_UNIQUE}:" |
708 |
|
709 |
!ifdef LIBRARY_X64 |
710 |
|
711 |
SetRegView lastused |
712 |
|
713 |
!endif |
714 |
|
715 |
!endif |
716 |
|
717 |
;------------------------ |
718 |
;Remove |
719 |
|
720 |
!ifndef UNINSTALLLIB_UNINSTALL_NOREMOVE |
721 |
|
722 |
;------------------------ |
723 |
;Check Windows File Protection |
724 |
|
725 |
!ifdef UNINSTALLLIB_UNINSTALL_REBOOT_PROTECTED | UNINSTALLLIB_UNINSTALL_NOREBOOT_PROTECTED |
726 |
|
727 |
!ifndef UNINSTALLLIB_DONE_LABEL |
728 |
|
729 |
!define UNINSTALLLIB_DONE_LABEL |
730 |
|
731 |
!endif |
732 |
|
733 |
System::Call "sfc::SfcIsFileProtected(i 0, w $R1) i.R0" |
734 |
|
735 |
StrCmp $R0 "error" "uninstalllib.notprotected_${UNINSTALLLIB_UNIQUE}" |
736 |
StrCmp $R0 "0" "uninstalllib.notprotected_${UNINSTALLLIB_UNIQUE}" |
737 |
|
738 |
Goto "uninstalllib.done_${UNINSTALLLIB_UNIQUE}" |
739 |
|
740 |
"uninstalllib.notprotected_${UNINSTALLLIB_UNIQUE}:" |
741 |
|
742 |
!endif |
743 |
|
744 |
;------------------------ |
745 |
;Unregister |
746 |
|
747 |
!ifdef UNINSTALLLIB_LIBTYPE_REGDLL | UNINSTALLLIB_LIBTYPE_REGDLLTLB |
748 |
|
749 |
!ifndef LIBRARY_X64 |
750 |
|
751 |
UnRegDLL $R1 |
752 |
|
753 |
!else |
754 |
|
755 |
ExecWait '"$SYSDIR\regsvr32.exe" /s /u "$R1"' |
756 |
|
757 |
!endif |
758 |
|
759 |
!endif |
760 |
|
761 |
!ifdef UNINSTALLLIB_LIBTYPE_REGEXE |
762 |
|
763 |
ExecWait '"$R1" /unregserver' |
764 |
|
765 |
!endif |
766 |
|
767 |
!ifdef UNINSTALLLIB_LIBTYPE_TLB | UNINSTALLLIB_LIBTYPE_REGDLLTLB |
768 |
|
769 |
TypeLib::UnRegister $R1 |
770 |
|
771 |
!endif |
772 |
|
773 |
!ifdef LIBRARY_SHELL_EXTENSION |
774 |
|
775 |
System::Call 'Shell32::SHChangeNotify(i ${SHCNE_ASSOCCHANGED}, i ${SHCNF_IDLIST}, i 0, i 0)' |
776 |
|
777 |
!endif |
778 |
|
779 |
!ifdef LIBRARY_COM |
780 |
|
781 |
System::Call 'Ole32::CoFreeUnusedLibraries()' |
782 |
|
783 |
!endif |
784 |
|
785 |
;------------------------ |
786 |
;Delete |
787 |
|
788 |
Delete $R1 |
789 |
|
790 |
!ifdef UNINSTALLLIB_UNINSTALL_REBOOT_PROTECTED | UNINSTALLLIB_UNINSTALL_REBOOT_NOTPROTECTED |
791 |
|
792 |
${If} ${FileExists} $R1 |
793 |
# File is in use, can't just delete. |
794 |
# Move file to another location before using Delete /REBOOTOK. This way, if |
795 |
# the user installs a new version of the DLL, it won't be deleted after |
796 |
# reboot. See bug #1097642 for more information on this. |
797 |
|
798 |
# Try moving to $TEMP. |
799 |
GetTempFileName $R0 |
800 |
Delete $R0 |
801 |
Rename $R1 $R0 |
802 |
|
803 |
${If} ${FileExists} $R1 |
804 |
# Still here, delete temporary file, in case the file was copied |
805 |
# and not deleted. This happens when moving from network drives, |
806 |
# for example. |
807 |
Delete $R0 |
808 |
|
809 |
# Try moving to directory containing the file. |
810 |
!insertmacro __InstallLib_Helper_GetParent $R1 $R0 |
811 |
GetTempFileName $R0 $R0 |
812 |
Delete $R0 |
813 |
Rename $R1 $R0 |
814 |
|
815 |
${If} ${FileExists} $R1 |
816 |
# Still here, delete temporary file. |
817 |
Delete $R0 |
818 |
|
819 |
# Give up moving, simply Delete /REBOOTOK the file. |
820 |
StrCpy $R0 $R1 |
821 |
${EndIf} |
822 |
${EndIf} |
823 |
|
824 |
# Delete the moved file. |
825 |
Delete /REBOOTOK $R0 |
826 |
${EndIf} |
827 |
|
828 |
!endif |
829 |
|
830 |
!endif |
831 |
|
832 |
;------------------------ |
833 |
;Done |
834 |
|
835 |
!ifdef UNINSTALLLIB_DONE_LABEL |
836 |
|
837 |
!undef UNINSTALLLIB_DONE_LABEL |
838 |
|
839 |
"uninstalllib.done_${UNINSTALLLIB_UNIQUE}:" |
840 |
|
841 |
!endif |
842 |
|
843 |
!ifdef LIBRARY_X64 |
844 |
|
845 |
${EnableX64FSRedirection} |
846 |
|
847 |
!endif |
848 |
|
849 |
Pop $R1 |
850 |
Pop $R0 |
851 |
|
852 |
;------------------------ |
853 |
;Undefine |
854 |
|
855 |
!undef UNINSTALLLIB_UNIQUE |
856 |
|
857 |
!undef ${UNINSTALLLIB_LIBTYPE_SET} |
858 |
!undef UNINSTALLLIB_LIBTYPE_SET |
859 |
!undef ${UNINSTALLLIB_SHARED_SET} |
860 |
!undef UNINSTALLLIB_SHARED_SET |
861 |
!undef ${UNINSTALLLIB_UNINSTALL_SET} |
862 |
!undef UNINSTALLLIB_UNINSTALL_SET |
863 |
|
864 |
!verbose pop |
865 |
|
866 |
!macroend |
867 |
|
868 |
!endif |
869 |
|
870 |
!verbose pop |