获取软件所有快捷方式名称,判断本地是否安装,并打开

  // 获取快捷方式路径
 char* getApplicationLnkLocation(HKEY locType , TCHAR lpValueName[])
 {
	 MyLog::getSingletonPtr()->log("NativeOperate|NativePlugin|getApplicationLnkLocation[start]");
	 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);
	 MyLog::getSingletonPtr()->log("NativeOperate|NativePlugin|getApplicationLnkLocation[end]");
	 // 释放缓冲区
	 return (char*)dataBuf;
	 
 }

 /*******************************
 *     函数名:TraverseFolder
 *     输入参数:lpPath(路径)
 *     输入参数:lnk(用来保存找到的lnk文件名)
 *     功能遍历文件夹函数
*********************************/
bool TraverseFolder(LPCTSTR lpPath,const char* lnk)
{
	//MyLog::getSingletonPtr()->log("NativeOperate|NativePlugin|TraverseFolder[start]");
	//MyLog::getSingletonPtr()->log("NativeOperate|NativePlugin|TraverseFolder[start]--lpPath='+%s+'--lnk='+%s+'",lpPath, 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);
				MyLog::getSingletonPtr()->log("NativeOperate|NativePlugin|TraverseFolder[find successed]");
				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);
	//MyLog::getSingletonPtr()->log("NativeOperate|NativePlugin|TraverseFolder[find failed]");
	return false;
}





            
阅读更多
上一篇修改的 创建队列程序 C语言。 队列元素 是堆分配内存,而非指针
下一篇检查本地网卡状态,如果网卡正常,再判断能否联网
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭