Windows下覆盖图标的实现

本文参考这里

为了取得类似Tortoise Git的文件状态的图标效果,需要自行实现

  1. 用Vistual Studio新建ATL工程
  2. 新建ATL Simple Object类
  3. 继承IShellIconOverlayIdentifier接口
  4. 实现接口的三个方法

实现后,使用命令可以分别注册和注销dll,需要注意的是,dll的位数需要与目标系统相同,32位的dll在64位的系统内不起作用

regsvr32 "C:\syncode\windows-qt\install\LenovoCloudSyncFolder\x64\Release\LenovoCloudSyncFolder.dll" -s & taskkill /f /im explorer.exe & explorer
regsvr32 /u "C:\syncode\windows-qt\install\LenovoCloudSyncFolder\x64\Release\LenovoCloudSyncFolder.dll" -s & taskkill /f /im explorer.exe & explorer

重启explorer.exe是为了让覆盖图标立刻生效
如果需要在NSIS脚本上;重启explorer.exe,可以使用

FindWindow $0 "Progman" "Program Manager"
System::Call User32::GetWindowThreadProcessId(ir0,*i.r0)
System::Call Kernel32::OpenProcess(i0x0001,i,ir0)i.r0
System::Call Kernel32::TerminateProcess(ir0,i0)
System::Call Kernel32::CloseHandle(ir0)