您的位置:首页 > 其它

从新修改 查找本地所有快捷方式 针对上一个版本不支持WIN8

2013-12-13 14:44 429 查看
// 获取快捷方式路径
 char* getApplicationLnkLocation(HKEY locType , TCHAR lpValueName[])
 {
	 HKEY hKey;
	 LONG nResult = 0;
	 DWORD dwSize = 0;	// 数据长度
	// char* reAppPath = "C:\ProgramData\Microsoft\Windows\Start Menu\Programs";
	 TCHAR lpSubKey[] = "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders";	
	 //TCHAR lpValueName[] = "Common Programs";
	 
	 nResult = RegOpenKeyEx(locType, lpSubKey, NULL, KEY_READ, &hKey);		
	 if( nResult != ERROR_SUCCESS )
	 {
		 return NULL;
	 }
	 // 第一次调用,获取数据长度
	 RegQueryValueEx(hKey, lpValueName, NULL, NULL, NULL, &dwSize);			// 缓冲区长度

	 // 动态分配缓冲区
	 LPBYTE dataBuf = new BYTE[dwSize];

	 // 第二次调用,获取数据
	 RegQueryValueEx(hKey, lpValueName, NULL, NULL, dataBuf, &dwSize);
	
	 // 关闭
	 RegCloseKey(hKey);

	 // 释放缓冲区
	 return (char*)dataBuf;

 }

 /*******************************
 *     函数名:TraverseFolder
 *     输入参数:lpPath(路径)
 *     输入参数:lnk(用来保存找到的lnk文件名)
 *     功能遍历文件夹函数
*********************************/
bool TraverseFolder(LPCTSTR lpPath,const char* lnk)
{
	TCHAR szFind[MAX_PATH] = {_T("\0")};
	WIN32_FIND_DATA findFileData;
	BOOL bRet;

	_tcscpy_s(szFind, MAX_PATH, lpPath);
	_tcscat_s(szFind, _T("\\*.*"));     //这里一定要指明通配符,不然不会读取所有文件和目录

	HANDLE hFind = ::FindFirstFile(szFind, &findFileData);
	if (INVALID_HANDLE_VALUE == hFind)
	{
		return false;
	}

	//遍历文件夹
	while (TRUE)
	{
		if (findFileData.cFileName[0] != _T('.'))
		{//不是当前路径或者父目录的快捷方式
			//_tprintf(_T("%s\\%s\n"), lpPath, findFileData.cFileName);
			//printf("find name is %s \n", findFileData.cFileName);

			if(!strcmp(findFileData.cFileName , lnk))
			{
				char buf[256] = {0};
				sprintf(buf,"%s\\%s",lpPath, findFileData.cFileName);

				ShellExecute(NULL,"open",buf,NULL,NULL,SW_SHOWNORMAL);
				return true;
			}
			if (findFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
			{//这是一个普通目录
				//设置下一个将要扫描的文件夹路径
				_tcscpy_s(szFind, MAX_PATH, lpPath);    
				_tcscat_s(szFind, _T("\\"));    
				_tcscat_s(szFind, findFileData.cFileName);
				//遍历该目录
				if(TraverseFolder(szFind,lnk))
				{
					return true;
				}
			}
		}
		//如果是当前路径或者父目录的快捷方式,或者是普通目录,则寻找下一个目录或者文件
		bRet = ::FindNextFile(hFind, &findFileData);
		if (!bRet)
		{
			break;
		}
	}

	::FindClose(hFind);
	return false;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐