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

  最近为了实现这个需求,网上找了很久也没有具体说明用注册表来实现的,大多数是用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_PATH
				GetModuleFileName(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第一次写帖子可能排版有些乱希望见谅

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值