Cómo crear software portátil Cómo utilizar NSIS para importar el registro
1
{registry::RestoreKey} file.reg $var
Pero si usa con frecuencia {registry:write after RestoreKey}, encontrará que la importación del registro a menudo falla o que los valores clave escritos se sobrescriben con los valores clave antiguos en el archivo de registro. El valor de la clave escrito será sobrescrito por el valor de la clave anterior en el archivo de registro. ¿Por qué sucede esto?
Resulta que el comando ${registry::RestoreKey} no esperó a que se completara la importación. El autor escribe en la documentación:
${registry::RestoreKey} simplemente ejecuta regedit: regedit /s "[archivo]"
Ejecutar Exec en lugar de ExecWait. Entonces, es posible que regedit.exe haya comenzado a ejecutar la siguiente línea de comandos antes de comenzar. Crear un instalador normal es un problema menor, pero el software portátil requiere una secuencia de pasos más precisa. Entonces, algunas personas tienen un código como este:
1
2
{registry::RestoreKey} file.reg $0
Sleep 200
Duerme un poco. ¿Cuánto duermes? Un segundo de sueño sigue siendo un año de sueño. Los perfeccionistas no utilizaremos este método de ciegos y elefantes. Debido a este comando, algunos amigos que usan complementos de registro habitualmente agregan una función de suspensión, que es completamente innecesaria. El autor dijo:
Pregunta: Entonces mi pregunta es, en su complemento, ¿qué más? ¿Las funciones se comportan igual (es decir, no esperan a que se completen las operaciones de registro)?
Respuesta: registro::RestoreKey es el único.
/showpost.php?p=2225200&postcount=105
Entonces, use:
1
ExecWait ' regedit /s "[ file]"' $var
¿No es esto suficiente?
Te equivocas de nuevo. Debemos ser estrictos con nosotros mismos al crear software portátil. En Vista y versiones posteriores, no podrás ejecutar el comando regedit /s sin autenticación UAC (incluso si estás en HKCU). claves importadas).
¿Cada software que posee requiere que los usuarios lo ejecuten con privilegios de administrador a través de la autenticación UAC?
Sin embargo, en la prueba del entorno UAC, encontrará que incluso sin autenticación UAC, el comando {registry::RestoreKey} puede completar la importación del registro. ¿Podría ser que el autor esté ocultando algo?
Entonces, como analfabeto de código, abre NSIS\Include\Registry.nsh y encuentra el siguiente código:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
p>16
17
! definir registro::RestoreKey `!insertmacro registro. :RestoreKey`
!macro registro::RestoreKey _FILE _ERR
registro::_RestoreKey /NOUNLOAD `${_FILE}`
Pop ${_ERR}
IntCmp ${_ERR}-2 0 0 +10 ;archivo ansi REGEDIT4
SetDetailsPrint ninguno
IfFileExists "$ SYSDIR\reg.exe" 0 +4 ;reg.exe para Windows2K/XP/ Vista/7
nsExec::ExecToStack `"$SYSDIR\reg.exe" import "${_FILE}"`
Pop ${_ERR}
StrCmp ${_ERR}0 +5 0
IfFileExists "$ WINDIR\regedit.exe" 0 +3 ;regedit. para Wine
ExecWait `"$WINDIR\regedit.exe" /s "${_FILE}"` ${_ERR}
IfErrors 0 +2
StrCpy ${_ERR}
SetDetailsPrint lastused
!macroend
¡Esta es una pregunta complicada! registro::RestoreKey falla al importar reg.exe y falla al importar regedit.exe /s. Debemos tener esta perseverancia y no dejar que un error de ejecución se convierta en un error.
Con tus ojos agudos, descubriste la clave de esta línea:
1
nsExec::ExecToStack `"$SYSDIR\reg.exe" import " ${_FILE }"`
Resulta que regedit /s requiere privilegios de administrador, pero el comando reg import no. Este es el secreto del éxito de {registry::RestoreKey}.
Sin embargo, ${registry::RestoreKey} primero intenta usar el complemento para importar y el complemento no espera a que se complete la importación, por lo que invertimos el orden al aplicar:
1
p>2
3
4
5
6
7
nsExec::ExecToStack `"$SYSDIR\reg.exe" import "${_FILE}"`
Pop $0
${IfNot } $0 == 0 p>
{registry::RestoreKey}"${_ FILE}" $0
Dormir 500
${IfNotThen} $0 == 0 ${|}StrCpy ${ _OutVar}Error ${||}
${Endif}
nsExec::ExecToStack Espera a que finalice la ejecución y se ejecuta primero. Si la ejecución falla, use {registry::RestoreKey} y haga una pausa de 0,5 segundos (un valor más seguro). Cuando la operación anterior siempre devuelve un error, deberíamos considerar marcar el final del software portátil para omitir la modificación del registro al final de la ejecución del software y no sobrescribir el archivo de registro original.
Sin embargo, cuando miras el código fuente de PortableApps.com Launcher, encontrarás que solo hay una línea sobre la importación del registro:
1
{ registro::RestoreKey} $DataDirectory\settings\$0.reg $ R9
Pero ¿por qué parece que PAL es tan estable y rara vez comete errores? Supongo que esto se debe a que el código de PAL es muy complejo y hay mucho trabajo que hacer antes de cada operación real, leer Launcher.ini, convertir variables, detectar la plataforma PAF... ¡lento, lento, lento, lento!