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

来源:互联网 发布:网络用语毛血旺是什么 编辑:程序博客网 时间:2024/05/16 05:49
  // 获取快捷方式路径 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;}


                                             
0 0