C++通过写注册表实现将文件夹映射为系统虚拟盘

来源:互联网 发布:数据线上带充电宝 编辑:程序博客网 时间:2024/05/19 22:57
  最近为了实现这个需求,网上找了很久也没有具体说明用注册表来实现的,大多数是用DefineDosDevice,或者调用系统工具,后来请教了一个CSDN上的朋友,然后自己慢慢摸索,最终可以实现了。不过还是有一些地方不明白的。希望有熟悉注册表的朋友能指点一下。
TRACE(location);char szUserName[MAX_NAME] = {0};char szUserSid[MAX_NAME] = {0};char szUserDomain[MAX_NAME] = {0};SID_NAME_USE snu;DWORD dwNameLen;DWORD dwSidLen;DWORD dwDomainLen;lstrcpy(szSid, "");dwNameLen = 256;dwSidLen = 256;dwDomainLen = 256;if (!GetUserName(szUserName,&dwNameLen)){TRACE("Fail To Get UserName\n");return FALSE;}dwNameLen = strlen(szUserName) + 1;if (LookupAccountName(NULL,szUserName,(PSID)szUserSid,&dwSidLen,szUserDomain,&dwDomainLen,&snu)){if (IsValidSid((PSID)szUserSid)){if (ConvertSid((PSID)szUserSid,szSid,&dwSize)){//TRACE(m_strDirectoryToMonitor);TCHAR exeFullPath[MAX_PATH]; // MAX_PATHGetModuleFileName(NULL,exeFullPath,MAX_PATH -1);CFileHandle m_fhandle;CString strRelativePath = m_fhandle.ExtractFromFullname(exeFullPath, DRIVE) + m_fhandle.ExtractFromFullname(exeFullPath,DIR);CString strIco = strRelativePath + "setup.ico";TRACE(strIco);HKEY hkey;  DWORD dWord;//设置盘名称//{0A379CC9-C4E2-4504-B2EE-4A9B40E25FC4}为程序独有的128位CLSID,这里为了方便直接写了,应该调用系统工具生成以免重复DWORD DS = RegCreateKeyEx(HKEY_CLASSES_ROOT/*HKEY_LOCAL_MACHINE*/,"CLSID\\{0A379CC9-C4E2-4504-B2EE-4A9B40E25FC4}",0,NULL,REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS | KEY_WOW64_64KEY,NULL,&hkey,&dWord);if (DS != ERROR_SUCCESS){//AfxMessageBox("写入CLASS_ROOT失败");}RegSetValue(hkey, NULL, REG_SZ, "虚拟盘名字",strlen("虚拟盘名字"));DWORD dw = RegSetValueEx(hkey, "InfoTip", 0, REG_SZ, (CONST BYTE*)"进入虚拟盘",strlen("进入虚拟盘")); 
//设置虚拟盘的图标
RegCreateKeyEx(HKEY_CLASSES_ROOT/*HKEY_LOCAL_MACHINE*/,"CLSID\\{0A379CC9-C4E2-4504-B2EE-4A9B40E25FC4}\\DefaultIcon",0,NULL,REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS | KEY_WOW64_64KEY,NULL,&hkey,&dWord);TRACE(strIco);RegSetValue(hkey, NULL, REG_SZ, strIco,strlen(strIco));//将设备添加到左侧组织条RegCreateKeyEx(HKEY_CLASSES_ROOT/*HKEY_LOCAL_MACHINE*/,"CLSID\\{0A379CC9-C4E2-4504-B2EE-4A9B40E25FC4}\\InprocServer32",0,NULL,REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS | KEY_WOW64_64KEY,NULL,&hkey,&dWord);RegSetValue(hkey, NULL, REG_SZ, "shdocvw.dll",strlen("shdocvw.dll"));RegSetValueEx(hkey, "ThreadingModel", 0, REG_SZ, (CONST BYTE*)"Apartment",strlen("Apartment"));//将云盘设置为系统文件夹RegCreateKeyEx(HKEY_CLASSES_ROOT/*HKEY_LOCAL_MACHINE*/,"CLSID\\{0A379CC9-C4E2-4504-B2EE-4A9B40E25FC4}\\Instance",0,NULL,REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS | KEY_WOW64_64KEY,NULL,&hkey,&dWord);RegSetValue(hkey, NULL, REG_SZ, "",strlen(""));RegSetValueEx(hkey, "CLSID", 0, REG_SZ, (CONST BYTE*)"{0afaced1-e828-11d1-9187-b532f1e9575d}",strlen("{0afaced1-e828-11d1-9187-b532f1e9575d}"));//设置云盘路径RegCreateKeyEx(HKEY_CLASSES_ROOT/*HKEY_LOCAL_MACHINE*/,"CLSID\\{0A379CC9-C4E2-4504-B2EE-4A9B40E25FC4}\\Instance\\InitPropertyBag",0,NULL,REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS | KEY_WOW64_64KEY,NULL,&hkey,&dWord);RegSetValue(hkey, NULL, REG_SZ, "",strlen(""));char *p = (LPSTR)(LPCTSTR)location;RegSetValueEx(hkey, "Target", 0, REG_SZ, (CONST BYTE*)p,strlen(location));RegCreateKeyEx(HKEY_CLASSES_ROOT/*HKEY_LOCAL_MACHINE*/,"CLSID\\{0A379CC9-C4E2-4504-B2EE-4A9B40E25FC4}\\ShellFolder",0,NULL,REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS | KEY_WOW64_64KEY,NULL,&hkey,&dWord);RegSetValue(hkey, NULL, REG_SZ, "",strlen(""));DWORD dwBuf=0xf8800108;            RegSetValueExA(hkey,(char*)"Attributes",0,REG_DWORD,(BYTE*)&dwBuf,sizeof(dwBuf));RegSetValueEx(hkey, "PinToNameSpaceTree", 0, REG_SZ, (CONST BYTE*)"",strlen(""));RegSetValueEx(hkey, "QueryForOverlay", 0, REG_SZ, (CONST BYTE*)"",strlen(""));RegSetValueEx(hkey, "wantsFORPARSING", 0, REG_SZ, (CONST BYTE*)"",strlen(""));//将云盘显示出来CString m_str1=szSid;CString m_str2="\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\MyComputer\\NameSpace\\{0A379CC9-C4E2-4504-B2EE-4A9B40E25FC4}";CString namespacestr=m_str1+m_str2;RegCreateKeyEx(HKEY_USERS,namespacestr,0,NULL,REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS | KEY_WOW64_64KEY,NULL,&hkey,&dWord);//add 2013/8/6 DWORD re; CString str11= "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\MyComputer\\NameSpace\\{0A379CC9-C4E2-4504-B2EE-4A9B40E25FC4}"; re = RegCreateKeyEx(HKEY_CURRENT_USER,str11,0,NULL,REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS | KEY_WOW64_64KEY,NULL,&hkey,&dWord); re=RegSetValue(hkey, NULL, REG_SZ, "虚拟盘",strlen("虚拟盘"));RegCloseKey(hkey);return TRUE;}}}return  FALSE;}

         由于每台电脑的情况(操作系统版本,32位或者64位)所以调用的注册表项可以能也不同,所以要将其中的:设置云盘名字,设置虚拟图标,添加到左侧组织条,将云盘设置为系统文件夹,设置云盘路径。这些写到注册表不同的位置中:

1.HKEY_LOCAL_MACHINE,"SOFTWARE\\Classes\\CLSID\\{0A379CC9-C4E2-4504-B2EE-4A9B40E25FC4}"

2.HKEY_CLASSES_ROOT,"Wow6432Node\\CLSID\\{0A379CC9-C4E2-4504-B2EE-4A9B40E25FC4}"

3.HKEY_CURRENT_USER,"Software\\Classes\\CLSID\\{0A379CC9-C4E2-4504-B2EE-4A9B40E25FC4}"

4.HKEY_CURRENT_USER,"Software\\Classes\\Wow6432Node\\CLSID\\{0A379CC9-C4E2-4504-B2EE-4A9B40E25FC4}"

5.HKEY_LOCAL_MACHINE,"SOFTWARE\\Classes\\Wow6432Node\\CLSID\\{0A379CC9-C4E2-4504-B2EE-4A9B40E25FC4}"

6.(HKEY_LOCAL_MACHINE,"SOFTWARE\\Classes\\Wow6432Node\\Classes\\CLSID\\{0A379CC9-C4E2-4504-B2EE-4A9B40E25FC4}

7. CString strSid = szSid;
CString csp = strSid + "\\";
csp += "Software\\Classes\\CLSid\\{0A379CC9-C4E2-4504-B2EE-4A9B40E25FC4}";
DWORD DS = RegCreateKeyEx(HKEY_USERS,csp,0,NULL,REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS | KEY_WOW64_64KEY,NULL,&hkey,&dWord);


以上这些我也不是很明白为什么,希望有动注册表的同学指教一下,这些路径分别是代表什么意思。


P.S第一次写帖子可能排版有些乱希望见谅

原创粉丝点击