VC常用代码之通过注册表寻找应用程序路径

很多时候在调用一些应用程序之前需要先找到应用程序的路径。使用CFileFind类效率较低,如果要寻找一些已经在注册表标明路径的应用程序,通过注册表来寻找不失为一个便捷的途径。下面就是通过注册表寻找应用程序路径的相关代码(以寻找Rar.exe为例,Rar.exeWinRar的控制台程序):

 

 

  1.  // 打开键
  2.     HKEY hKEY;
  3.     LPCTSTR Rgspath = "WinRAR//shell//open//command";
  4.     LONG ret = RegOpenKeyEx(HKEY_CLASSES_ROOT, Rgspath, 0, KEY_READ, &hKEY);
  5.     
  6.     if(ret != ERROR_SUCCESS)
  7.     { 
  8.         RegCloseKey(hKEY);
  9.         return FALSE;
  10.     }
  11.     // 读取键值内容
  12.     DWORD dwInfoSize;
  13.     DWORD type = REG_SZ;
  14.     BYTE UserInfo[255];
  15.     // zjc 08.04.24 added begin
  16.     /*
  17.     注意RegQueryValueEx最后一个参数是个双向参数,入参时表示的是前一个参数的缓冲区大小,出参时表示的是返回的大小。
  18.     所以最好把UserInfo的大小给dwInfoSize,防止UserInfo溢出。
  19.     */
  20.     dwInfoSize = sizeof(UserInfo)/sizeof(BYTE); 
  21.     
  22.     ret = RegQueryValueEx(hKEY, NULL, NULL, &type, UserInfo, &dwInfoSize);
  23.     if(ret!=ERROR_SUCCESS)
  24.     { 
  25.         LPVOID lpMsgBuf;
  26.         DWORD dw = GetLastError(); 
  27.         
  28.         FormatMessage(
  29.             FORMAT_MESSAGE_ALLOCATE_BUFFER | 
  30.             FORMAT_MESSAGE_FROM_SYSTEM,
  31.             NULL,
  32.             dw,
  33.             MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
  34.             (LPTSTR) &lpMsgBuf,
  35.             0, NULL );  
  36.         MessageBox((LPCTSTR)lpMsgBuf, "系统错误", MB_OK|MB_ICONSTOP); 
  37.         LocalFree(lpMsgBuf);    
  38.         RegCloseKey(hKEY);
  39.         return FALSE;
  40.     }
  41.     
  42.     CString csRarAppPath;
  43.     csRarAppPath.Format("%s",UserInfo);
  44.     int nCount = csRarAppPath.ReverseFind('//');
  45.     csRarAppPath = csRarAppPath.Mid(0,nCount);
  46.     // 关闭键
  47.     RegCloseKey(hKEY);
原文地址:https://www.cnblogs.com/lanzhi/p/6471199.html