NoName Team 電腦資訊討論區

 找回密碼
 我要註冊
搜索
12
返回列表 發新帖
樓主: wnchn

[問題] 請教修改登錄檔後,如何不重啟系統讓其生效

[複製鏈接]
 樓主| 發表於 2014-11-26 13:57:42 | 顯示全部樓層
我把tib檔瀏覽的功能獨立出來,
用批次檔的方式,設定相關檔案為當前目錄,建立Reg檔,再寫入登錄檔
檔案位置沒問題,功能也可以正常執行。

加上wusun提到的那行指令,就可以了。
Pecmd.exe CALL $SHELL32.DLL,SHChangeNotify,#134217728,#0,#0,#0

不知道為什麼,點兩下可以直接開啟tib檔了,不需要再用另外開啟視窗的方式了
以下是批次檔的內容。可以正常執行,缺的檔案就請自備了

SET CCD=%cd:\=\\%

echo Windows Registry Editor Version 5.00 > Tib_x64.reg & echo. >> Tib_x64.reg

echo [HKEY_LOCAL_MACHINE\SOFTWARE\Acronis] >> Tib_x64.reg & echo. >> Tib_x64.reg

echo [HKEY_LOCAL_MACHINE\SOFTWARE\Acronis\BackupAndRecovery] >> Tib_x64.reg & echo. >> Tib_x64.reg

echo [HKEY_LOCAL_MACHINE\SOFTWARE\Acronis\BackupAndRecovery\CommonComponents] >> Tib_x64.reg
echo "icu38.dll"="%CCD%\\icu38.dll" >> Tib_x64.reg
echo "resource.dll"="%CCD%\\resource.dll" >> Tib_x64.reg & echo. >> Tib_x64.reg



echo [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\.tib] >> Tib_x64.reg
echo @="tibfile" >> Tib_x64.reg & echo. >> Tib_x64.reg

echo [HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.TIB] >> Tib_x64.reg & echo. >> Tib_x64.reg

echo [HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.TIB\OpenWithList] >> Tib_x64.reg & echo. >> Tib_x64.reg

echo [HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.TIB\OpenWithProgids] >> Tib_x64.reg
echo "tibfile"=hex(0): >> Tib_x64.reg & echo. >> Tib_x64.reg



echo [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\tibfile] >> Tib_x64.reg
echo @="Acronis Backup File" >> Tib_x64.reg & echo. >> Tib_x64.reg

echo [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\tibfile\CLSID] >> Tib_x64.reg
echo @="{C539A15B-3AF9-4c92-B771-50CB78F5C751}" >> Tib_x64.reg & echo. >> Tib_x64.reg

echo [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\tibfile\DefaultIcon] >> Tib_x64.reg
echo @="%CCD%\\tib_mounter.dll,0" >> Tib_x64.reg & echo. >> Tib_x64.reg

echo [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\tibfile\Shell] >> Tib_x64.reg & echo. >> Tib_x64.reg

echo [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\tibfile\Shell\open] >> Tib_x64.reg
echo @="" >> Tib_x64.reg & echo. >> Tib_x64.reg

echo [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\tibfile\Shell\open\command] >> Tib_x64.reg
echo @="explorer /idlist,%%I,%%L" >> Tib_x64.reg & echo. >> Tib_x64.reg

echo [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\tibfile\Shell\open\ddeexec] >> Tib_x64.reg
echo "NoActivateHandler"="" >> Tib_x64.reg
echo @="[ViewFolder(\\\"%%l\\\", %%I, %%S)]" >> Tib_x64.reg & echo. >> Tib_x64.reg

echo [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\tibfile\Shell\open\ddeexec\application] >> Tib_x64.reg
echo @="Folders" >> Tib_x64.reg & echo. >> Tib_x64.reg

echo [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\tibfile\Shell\open\ddeexec\ifexec] >> Tib_x64.reg
echo @="[]" >> Tib_x64.reg & echo. >> Tib_x64.reg

echo [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\tibfile\Shell\open\ddeexec\topic] >> Tib_x64.reg
echo @="AppProperties" >> Tib_x64.reg & echo. >> Tib_x64.reg



echo [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{C539A15B-3AF9-4c92-B771-50CB78F5C751}] >> Tib_x64.reg
echo @="Acronis Backup and Recovery 10 Shell Extension" >> Tib_x64.reg & echo. >> Tib_x64.reg

echo [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{C539A15B-3AF9-4c92-B771-50CB78F5C751}\Implemented Categories] >> Tib_x64.reg & echo. >> Tib_x64.reg

echo [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{C539A15B-3AF9-4c92-B771-50CB78F5C751}\Implemented Categories\{00021490-0000-0000-C000-000000000046}] >> Tib_x64.reg
echo @="" >> Tib_x64.reg & echo. >> Tib_x64.reg

echo [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{C539A15B-3AF9-4c92-B771-50CB78F5C751}\InProcServer32] >> Tib_x64.reg
echo "ThreadingModel"="Apartment" >> Tib_x64.reg
echo @="%CCD%\\tishell64.dll" >> Tib_x64.reg & echo. >> Tib_x64.reg

echo [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{C539A15B-3AF9-4c92-B771-50CB78F5C751}\ShellFolder] >> Tib_x64.reg
echo "Attributes"=dword:a0000000 >> Tib_x64.reg & echo. >> Tib_x64.reg



echo [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{C539A15C-3AF9-4c92-B771-50CB78F5C751}] >> Tib_x64.reg
echo @="Acronis True Image Shell Extension Backend" >> Tib_x64.reg
echo "AppID"="{C4E69DB9-E094-483e-B922-E7ADE65FB497}" >> Tib_x64.reg & echo. >> Tib_x64.reg

echo [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{C539A15C-3AF9-4c92-B771-50CB78F5C751}\InProcServer32] >> Tib_x64.reg
echo "ThreadingModel"="Apartment" >> Tib_x64.reg
echo @="%CCD%\\tishell_svr64.dll" >> Tib_x64.reg & echo. >> Tib_x64.reg


regedit /s Tib_x64.reg

Pecmd.exe CALL $SHELL32.DLL,SHChangeNotify,#134217728,#0,#0,#0
發表於 2014-11-26 17:06:21 | 顯示全部樓層
wnchn 發表於 2014-11-26 13:57
我把tib檔瀏覽的功能獨立出來,
用批次檔的方式,設定相關檔案為當前目錄,建立Reg檔,再寫入登錄檔
檔案位 ...

真是高手一枚...恭喜你能達到你要的需求(筆記...)
發表於 2014-11-27 02:12:22 | 顯示全部樓層
我個人的話...大概會把固定不變的值用 .reg 直接 regedit /s ...就不用 echo >>  了
路徑部份用 reg.exe add ...這樣應該看上去還比較簡潔

你看是不是還有部份的註冊值沒補全
用 google 搜尋一下 {C4E69DB9-E094-483e-B922-E7ADE65FB497}
就可以找到別人的 DIY 的註冊值

別人的有...不知道是不是缺這個雖然覺的可能性不大
[HKEY_LOCAL_MACHINE\Software\Classes\AppID\{C4E69DB9-E094-483e-B922-E7ADE65FB497}]
@="Acronis True Image Shell Extension Backend"
"DllSurrogate"=""

還有是否有註冊值有錯...例如 我google 找到的是

[HKEY_LOCAL_MACHINE\Software\Classes\tibfile\Shell\open\ddeexec]
@="[ViewFolder(\"%l\", %I, %S)]"
"NoActivateHandler"=""

你的是...
@="[ViewFolder(\\\"%l\\\", %I, %S)]"  
不一樣喔 ( 猜想應該是這個...所以 ViewFolder 路徑出錯? )
 樓主| 發表於 2014-11-27 11:20:49 | 顯示全部樓層
阿達金田一 發表於 2014-11-27 02:12
我個人的話...大概會把固定不變的值用 .reg 直接 regedit /s ...就不用 echo >>  了
路徑部份用 reg.exe ad ...

謝謝金田一的回覆

個人這樣作的考量是因為,這個不僅僅在pe環境可以用。在一般環境也能用。
考慮到放的路徑可能不一樣,才用echo的方式去產生當前路徑。

[HKEY_LOCAL_MACHINE\Software\Classes\AppID\{C4E69DB9-E094-483e-B922-E7ADE65FB497}]
這行我沒補齊,目前功能是正常,能打開也能從裡面複製檔案出來。原本點兩下沒反應的問題,
使用wusun提醒的指令更新關連後解決了。
Pecmd.exe CALL $SHELL32.DLL,SHChangeNotify,#134217728,#0,#0,#0


[HKEY_LOCAL_MACHINE\Software\Classes\tibfile\Shell\open\ddeexec]
@="[ViewFolder(\"%l\", %I, %S)]"
"NoActivateHandler"=""

我的為echo @="[ViewFolder(\\\"%%l\\\", %%I, %%S)]"
是因為%和\為殊特字元的關係
從登錄檔匯出時
該行就為  @="[ViewFolder(\\\"%l\\\", %I, %S)]"
實際登錄完,查看時是 @="[ViewFolder(\"%l\", %I, %S)]"  沒錯。
而%%是因為批次檔中%為殊特字元,要再加1個%,才會在.reg顯示為@="[ViewFolder(\\\"%l\\\", %I, %S)]",不讓%被吃掉。


pe上使用目前沒問題了

但如果要在一般環境下使用
rundll32.exe SHELL32.DLL SHChangeNotify (#134217728,#0,#0,#0)
上面這行執行沒反應,似乎是不能直接在command下弄~"~。只能重啟explorer,或是用autoit做一個小程式來取代了。
發表於 2014-11-27 20:17:30 | 顯示全部樓層
本帖最後由 阿達金田一 於 2014-11-27 20:46 編輯

= =
我的意思就是 reg.exe add 就可以照當前路徑去登錄
例如
reg add "HKLM\SOFTWARE\Classes\CLSID\{C539A15C-3AF9-4c92-B771-50CB78F5C751}\InProcServer32" /d "%CD%\tishell_svr64.dll" /f

就算你習慣+堅持要用 cmd 產生 .reg
那也可以分成2個 .reg ...
一個是固定值的 .reg ...直接用存儲好...例如 Tib_64_1.reg
一個是用來產生登錄路徑的 .reg  Tib_x64_2.reg

echo >> Tib_64_2.reg (表示必需的 echo >> ...)
regedit /s Tib_64_1.reg
regedit /s Tib_64_2.reg

用 reg add 也只是差在 不用 echo >> Tib_64_2.reg
regedit /s  Tib_64_1.reg
reg add

另外....reg 我知道你那批次檔是在做啥
批次中 %% = % 我知道
.reg 中 \ 是特殊字元 在登錄時 \" = " , \\=\  ... 也沒錯
不過我沒在說登錄後的值...而是 .reg 中的值
只是...你輸出的 .reg 的確和人家不一樣
網路上找的
http://vik64.no-ip.org:8080/VIKT ... eServer/acronis.reg

我貼的 [HKEY_LOCAL_MACHINE\Software\Classes\tibfile\Shell\open\ddeexec]
都是 .reg 的資料 (而不是 regedit 中查看到的... 你沒看格式都是 .reg 的格式嗎)
你的 .reg 和 我網路找的...的確是不一樣
也就是說...人家的 .reg 註冊後...查看應該是
[ViewFolder("%l", %I, %S)]

所以你應該查一下...正常的註冊值是
[ViewFolder("%l", %I, %S)]
還是你的
[ViewFolder(\"%l\", %I, %S)]

另外 rundll32.exe 會不會是這樣下指令
rundll32.exe SHELL32.DLL,SHChangeNotify  134217728,0,0,0
 樓主| 發表於 2014-11-28 12:04:41 | 顯示全部樓層
本帖最後由 wnchn 於 2014-11-28 14:21 編輯

謝謝金田一大大的指導

後來我改成如你所說的,將固定值的存在1個reg檔,在批次檔中用reg add的方式寫入異動值。
這樣整個批次檔看起來也乾淨多了,也比較好除錯。

[ViewFolder("%l", %I, %S)]  <<< 這個是對的,應該是我之前在測試時把登錄檔弄亂了
早上重灌時才發現這個問題。

rundll32.exe SHELL32.DLL,SHChangeNotify  134217728,0,0,0  << 這個在批次檔上使用,關聯還是不會變,google一下,這問題也有人提出過,但沒一個比較好的辦法,目前做法就是pe下用pecmd的方式,正常環境則是重啟explorer。
taskkill.exe /f /im explorer.exe && explorer

以下是批次檔內容....
regedit /s tibfile.reg

reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Acronis\BackupAndRecovery\CommonComponents" /v "icu38.dll" /d "%CD%\icu38.dll" /F
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Acronis\BackupAndRecovery\CommonComponents" /v "resource.dll" /d "%CD%\resource.dll" /F

reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Classes\tibfile\DefaultIcon" /d "%CD%\tib_mounter.dll,0" /F

reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{C539A15B-3AF9-4c92-B771-50CB78F5C751}\InProcServer32" /d "%CD%\tishell64.dll" /F

reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{C539A15C-3AF9-4c92-B771-50CB78F5C751}\InProcServer32" /d "%CD%\tishell_svr64.dll" /F

if exist %SystemRoot%\system32\pecmd.exe ( Pecmd.exe CALL $SHELL32.DLL,SHChangeNotify,#134217728,#0,#0,#0) else ( taskkill /f /im explorer.exe && explorer)


以下是登錄檔內容(安裝版本ABR11.5.39029,安裝後直接匯出:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\.tib]
@="tibfile"


[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\tibfile]
@="Acronis 備份檔案"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\tibfile\CLSID]
@="{C539A15B-3AF9-4c92-B771-50CB78F5C751}"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\tibfile\DefaultIcon]
@="D:\\Program Files (x86)\\Acronis\\BackupAndRecoveryConsole\\tishell_abr.dll,0"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\tibfile\Shell]

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\tibfile\Shell\open]
@=""

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\tibfile\Shell\open\command]
@="explorer /idlist,%I,%L"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\tibfile\Shell\open\ddeexec]
"NoActivateHandler"=""
@="[ViewFolder(\"%l\", %I, %S)]"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\tibfile\Shell\open\ddeexec\application]
@="Folders"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\tibfile\Shell\open\ddeexec\ifexec]
@="[]"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\tibfile\Shell\open\ddeexec\topic]
@="AppProperties"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\tibfile\ShellEx]

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\tibfile\ShellEx\ContextMenuHandlers]

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\tibfile\ShellEx\ContextMenuHandlers\{C539A15A-3AF9-4c92-B771-50CB78F5C751}]
@=""


[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{C539A15B-3AF9-4c92-B771-50CB78F5C751}]

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{C539A15B-3AF9-4c92-B771-50CB78F5C751}\Implemented Categories]

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{C539A15B-3AF9-4c92-B771-50CB78F5C751}\Implemented Categories\{00021490-0000-0000-C000-000000000046}]

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{C539A15B-3AF9-4c92-B771-50CB78F5C751}\InProcServer32]
@="D:\\Program Files (x86)\\Acronis\\BackupAndRecoveryConsole\\tishell64.dll"
"ThreadingModel"="Apartment"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{C539A15B-3AF9-4c92-B771-50CB78F5C751}\ShellFolder]
"Attributes"=dword:a0000000


[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{C539A15C-3AF9-4c92-B771-50CB78F5C751}]
@="Acronis True Image Shell Extension Backend"
"AppID"="{C4E69DB9-E094-483e-B922-E7ADE65FB497}"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{C539A15C-3AF9-4c92-B771-50CB78F5C751}\InProcServer32]
"ThreadingModel"="Apartment"
@="D:\\Program Files (x86)\\Acronis\\BackupAndRecoveryConsole\\tishell_svr64.dll"
發表於 2014-12-5 17:48:14 | 顯示全部樓層


rundll32.exe SHELL32.DLL,SHChangeNotify  134217728,0,0,0
關於以上指令無效的一個解決方法為:自己寫程式
SHChangeNotify.cpp
  1. #include <windows.h>
  2. #include <tchar.h>
  3. #include <Shlobj.h>

  4. typedef void (*MYPROC)(LONG wEventId, UINT uFlags, _In_opt_  LPCVOID dwItem1, _In_opt_  LPCVOID dwItem2);

  5. int main(int argc, char** argv) {
  6.     HINSTANCE hinstLib;
  7.     MYPROC ProcAdd;

  8.     // Get a handle to the DLL module.
  9.     hinstLib = LoadLibrary(_T("Shell32.dll"));

  10.     // If the handle is valid, try to get the function address.
  11.     if (hinstLib != NULL)
  12.     {
  13.         ProcAdd = (MYPROC) GetProcAddress(hinstLib, "SHChangeNotify");

  14.         // If the function address is valid, call the function.
  15.         if (NULL != ProcAdd)
  16.             (ProcAdd)(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, NULL, NULL);
  17.         // Free the DLL module.
  18.         FreeLibrary(hinstLib);
  19.     }

  20.     return 0;
  21. }
複製代碼
用Orwell Dev-C++編譯成執行檔,試了一下,可以作用,好似沒問題。
但Avira會報有毒,有疑慮可以自己編譯!






本帖子中包含更多資源

您需要 登錄 才可以下載或查看,沒有帳號?我要註冊

x
您需要登錄後才可以回帖 登錄 | 我要註冊

本版積分規則

小黑屋|手機版|NoName Team 電腦資訊討論區 |網站地圖

GMT+8, 2025-8-18 19:19 , Processed in 0.101558 second(s), 15 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回復 返回頂部 返回列表