K.A.V., Регистрация dll провожу через команду RegDLL, а дерегистрацию как сделать? Есть противоположная команда? В справке не нашел.
Кстати, RegDLL/UnRegDLL не работают в x64-системах, для корректной регистрации библиотеки в x64-системе, нужно вызывать regsvr32, все об этом знают?
Это было выявлено уже не помню как, либо здесь кто-то об этом говорил, либо мне кто-то репорт кидал, когда создаваемые SFX архивы через мой креатор не регистрировали dll, либо я сам это обнаружил
Возможно, этот баг уже исправили и всё наладили в новой сборке NSIS, пока не было времени тестировать (а может, моя личная dll написана криво, на которой тестил
)В любом случае, проверьте, регистрирует ли новая сборка NSIS библиотеки через эти команды, а если нет - пользуйтесь логической конструкцией, например, я буду пользоваться в своём SFX Creator таким кодом для регистрации библиотек:
Сохраняем в переменную $IsWow64Process тип системы (если значение 1 = 64 бита)
Код:
Код: Выделить всё
Function .onInit
Var /Global IsWow64Process
System::Call kernel32::GetCurrentProcess()i.s
System::Call kernel32::IsWow64Process(is,*i.s)
Pop $IsWow64Process
FunctionEndДля регистрации использовать так
Код:
Код: Выделить всё
${If} $IsWow64Process == "1"
ExecWait 'regsvr32 /s "$TEMP\MyDll.dll"'
${Else}
RegDLL "$TEMP\MyDll.dll"
${EndIf}Для отмены регистрации использовать так
Код:
Код: Выделить всё
${If} $IsWow64Process == "1"
ExecWait 'regsvr32 /u /s "$TEMP\MyDll.dll"'
${Else}
UnRegDLL "$TEMP\MyDll.dll"
${EndIf}Можно загнать всё в макросы для более удобного использования:
Скрытый текст
[spoiler]В начале кода:
Код: [/spoiler]
Код: Выделить всё
!define MyRegDLL "!insertmacro MyRegDLL"
!macro MyRegDLL _FILE_
${If} $IsWow64Process == "1"
ExecWait 'regsvr32 /s "${_FILE_}"'
${Else}
RegDLL "${_FILE_}"
${EndIf}
!macroend
!define MyUnRegDLL "!insertmacro MyUnRegDLL"
!macro MyUnRegDLL _FILE_
${If} $IsWow64Process == "1"
ExecWait 'regsvr32 /u /s "${_FILE_}"'
${Else}
UnRegDLL "${_FILE_}"
${EndIf}
!macroendНе забудьте получить тип системы:
Код:
Код: Выделить всё
Function .onInit
Var /Global IsWow64Process
System::Call kernel32::GetCurrentProcess()i.s
System::Call kernel32::IsWow64Process(is,*i.s)
Pop $IsWow64Process
FunctionEndДля регистрации использовать так
Код:
Код: Выделить всё
${MyRegDLL} "$TEMP\MyDll.dll"Для отмены регистрации использовать так
Код:
Код: Выделить всё
${MyUnRegDLL} "$TEMP\MyDll.dll"Не тестировал, но вроде всё правильно написал
Спасибо!