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



  1.  // 打开键
  2.     HKEY hKEY;
  3.     LPCTSTR Rgspath = "WinRAR\\shell\\open\\command";
  4.     LONG ret = RegOpenKeyEx(HKEY_CLASSES_ROOT, Rgspath, 0, KEY_READ, &hKEY);

  5.     if(ret != ERROR_SUCCESS)
  6.     { 
  7.         RegCloseKey(hKEY);
  8.         return FALSE;
  9.     }
  10.     // 读取键值内容
  11.     DWORD dwInfoSize;
  12.     DWORD type = REG_SZ;
  13.     BYTE UserInfo[255];
  14.     // zjc 08.04.24 added begin
  15.     /*
  16.     注意RegQueryValueEx最后一个参数是个双向参数,入参时表示的是前一个参数的缓冲区大小,出参时表示的是返回的大小。
  17.     所以最好把UserInfo的大小给dwInfoSize,防止UserInfo溢出。
  18.     */
  19.     dwInfoSize = sizeof(UserInfo)/sizeof(BYTE); 

  20.     ret = RegQueryValueEx(hKEY, NULL, NULL, &type, UserInfo, &dwInfoSize);
  21.     if(ret!=ERROR_SUCCESS)
  22.     { 
  23.         LPVOID lpMsgBuf;
  24.         DWORD dw = GetLastError(); 

  25.         FormatMessage(
  26.             FORMAT_MESSAGE_ALLOCATE_BUFFER | 
  27.             FORMAT_MESSAGE_FROM_SYSTEM,
  28.             NULL,
  29.             dw,
  30.             MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
  31.             (LPTSTR) &lpMsgBuf,
  32.             0, NULL );  
  33.         MessageBox((LPCTSTR)lpMsgBuf, "系统错误", MB_OK|MB_ICONSTOP); 
  34.         LocalFree(lpMsgBuf);    
  35.         RegCloseKey(hKEY);
  36.         return FALSE;
  37.     }

  38.     CString csRarAppPath;
  39.     csRarAppPath.Format("%s",UserInfo);
  40.     int nCount = csRarAppPath.ReverseFind('//');
  41.     csRarAppPath = csRarAppPath.Mid(0,nCount);
  42.     // 关闭键
  43.     RegCloseKey(hKEY);