以下代码实现了在“我的电脑”里面添加一个图标

C/C++ codeBOOL CMyFolder::RegisterNamespaceExtension(REFCLSID refClsid, LPCTSTR lpszName, BOOL bCurUser)
{
  // 转换CLSID为字符串
  LPOLESTR pwszClsid = NULL;
  StringFromCLSID(clsid, &pwszClsid);
  TCHAR szClsid[MAX_PATH];
#ifdef _UNICODE
  StrCpy(szClsid, pwszClsid);
#else
  USES_CONVERSION;
  StrCpy(szClsid, W2CT(pwszClsid));
#endif
  CoTaskMemFree(pwszClsid);

  // NameSpace CLSID

  HKEY hKeyRoot = HKEY_LOCAL_MACHINE;
  if (bCurUser)
  hKeyRoot = HKEY_CURRENT_USER;

  TCHAR szNameSpace[MAX_PATH] = _T("Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\MyComputer\\NameSpace\\");
  StrCat(szNameSpace, szClsid);

  HKEY hKeyNamespace;
  DWORD dwDisposition = 0;
  if (ERROR_SUCCESS != RegCreateKeyEx(hKeyRoot, szNameSpace, 0, NULL, REG_OPTION_VOLATILE, KEY_ALL_ACCESS, NULL, &hKeyNamespace, &dwDisposition))
  {
  return FALSE;
  }

  DWORD dwType = REG_SZ;
  DWORD dwSize = (DWORD)(_tcslen(lpszName) + sizeof(TCHAR));
  RegSetValueEx(hKeyNamespace, NULL, 0, dwType, (BYTE*)lpszName, dwSize);

  RegCloseKey(hKeyNamespace);

  // Shell

  TCHAR szModuleName[MAX_PATH];
  TCHAR szModulePath[MAX_PATH];
  GetModuleFileName(AfxGetInstanceHandle(), szModuleName, MAX_PATH);
  StrCpy(szModulePath, szModuleName);
  PathRemoveFileSpec(szModulePath);

  // HKEY_CLASSES_ROOT\CLSID

  TCHAR szMyClsid[MAX_PATH];
  StrCpy(szMyClsid, _T("CLSID\\"));
  StrCat(szMyClsid, szClsid);

  HKEY hKeyClsid;
  if (ERROR_SUCCESS != RegOpenKeyEx(HKEY_CLASSES_ROOT, szMyClsid, 0, KEY_ALL_ACCESS, &hKeyClsid))
  {
  return FALSE;
  }

  // Name
  RegSetValueEx(hKeyClsid, NULL, 0, dwType, (BYTE*)lpszName, dwSize);

  // Infotip
  TCHAR szInfotip[] = _T("Myfolder shell namespace extension.");
  dwSize = (DWORD)(_tcslen(szInfotip) + sizeof(TCHAR));
  RegSetValueEx(hKeyClsid, _T("InfoTip"), 0, dwType, (BYTE*)szInfotip, dwSize);

  // DefaultIcon
  TCHAR szDefaultIcon[MAX_PATH];
  StrCpy(szDefaultIcon, szModuleName);
  StrCat(szDefaultIcon, _T(",0"));
  dwSize = (DWORD)(_tcslen(szDefaultIcon) + sizeof(TCHAR));
  HKEY hKeyIcon;
  RegCreateKeyEx(hKeyClsid, _T("DefaultIcon"), 0, NULL, REG_OPTION_VOLATILE, KEY_ALL_ACCESS, NULL, &hKeyIcon, &dwDisposition);
  RegSetValueEx(hKeyIcon, NULL, 0, dwType, (BYTE*)szDefaultIcon, dwSize);
  RegCloseKey(hKeyIcon);
...

  RegCloseKey(hKeyClsid);

  return TRUE;
}

当然,这只是添加了一个图标。要实现相应的功能,需要自己创建并注册一个进程内COM组件,这个COM的CLSID就是上面这个函数第一个参数。这个COM组件至少需要导出并实现以下接口: 
IShellExtInit 
IPersistFolder 
IEnumIDList 
IShellView 
IShellFolder 
还可以选择性实现并导出以下接口: 
IExtractIcon 
IContextMenu3 
IQueryInfo 
等 
具体在SDK中有个例子SampView可以参考。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值