2016-03-07 251 views
0

我正在做一個安裝程序,當它卸載後Windows會拋出一個錯誤(即使使用regsrv32 /u運行,所以我基本上想要將/s標誌添加到NSIS中的RegDll "$SYSDIR\foo32.dll"中腳本。NSIS中出現RegDll錯誤信息

我還以爲$SysDirwindows\syswow64在64位系統和system32 32位?它是存在於系統路徑中的32位驅動程序。

感謝

+0

你確定你的意思是驅動程序?驅動程序通常不是由regsrv32/RegDll安裝的,在64位系統上,所有驅動程序必須是64位的! – Anders

+0

這是一個正在啓用的視頻編解碼器。 –

回答

1

我有點困惑,因爲你在說話約RegDLL和regsrv32.exe,他們是不同的東西! RegDLL永遠不能使用a/s開關,因爲它調用的函數沒有無聲參數。

RegDLL和UnRegDLL是NSIS指令,它們在內部分別爲DllRegisterServer和DllUnregisterServer分別呼叫LoadLibrary + GetProcAddress,並且從不使用regsrv32.exe。他們從不顯示任何消息對話框,但他們確實在instfiles頁面上的日誌中打印了一些文本,您可以使用SetDetailsPrint來控制它。您的庫中的註冊函數可能會顯示一個消息框,但NSIS無法做到這一點。

NSIS還附帶一個名爲Library.nsh的頭文件,它包含對事物註冊方式的更高級控制,它可能會針對64位庫調用「$ SYSDIR \ regsvr32.exe」,但它始終使用/ s開關。使用Library.nsh時,如果您還安裝64位庫,則必須設置正確的定義!

如果你總是僅安裝32位的庫,可能是這個樣子:

!include Library.nsh 
Section Uninstall 
!insertmacro UnInstallLib REGDLL NOTSHARED REBOOT_NOTPROTECTED "$InstDir\whatever.dll" 
SectionEnd 

如果你有32位和64位庫,可能是這個樣子:

!include Library.nsh 
!include x64.nsh 
Section Uninstall 
!insertmacro UnInstallLib REGDLL NOTSHARED REBOOT_NOTPROTECTED "$InstDir\whatever-32.dll" 

${If} ${RunningX64} 
    !define LIBRARY_X64 
    !insertmacro UnInstallLib REGDLL NOTSHARED REBOOT_NOTPROTECTED "$InstDir\whatever-64.dll" 
    !undef LIBRARY_X64 
${EndIf} 
SectionEnd 
+0

是的,我用它來比較,我知道它們是不同的! :-)是的,即使在64位系統上,磁帶庫也始終是32位。只是想指出,在命令行'regsvr32/u'和'UnRegDll'具有相同的「錯誤」,這不是真的錯誤,因爲它仍然註銷,但我不希望錯誤發生時,運行'unregdll '。 –

+0

regsvr32/u顯示錯誤,但regsvr32/s/u不顯示?如果你能解釋這個錯誤是什麼以及它是什麼樣子,這將是有幫助的。它是一個消息框(一個新的彈出對話框)?如果UnRegDll顯示一個消息框,那麼NSIS無法做到這一點,因爲UnRegDll僅打印到instfiles頁面上的日誌,而其他任何東西都來自您要註銷的組件。 – Anders

+0

regsvr32從管理員命令提示符成功,就像regdll沒有發生事件一樣。 regsvr32/u提供了一個錯誤對話框,就像unregdll所做的一樣(準確地說,確切地說是相同的)。 regsrv32/u/s是成功的,不會顯示錯誤對話框。我喜歡爲unregdll做類似的事情,所以它沒有任何反饋。或者是否有一個shell32.dll函數,我可以這樣做? –