很多时候在调用一些应用程序之前需要先找到应用程序的路径。使用CFileFind类效率较低,如果要寻找一些已经在注册表标明路径的应用程序,通过注册表来寻找不失为一个便捷的途径。下面就是通过注册表寻找应用程序路径的相关代码(以寻找Rar.exe为例,Rar.exe是WinRar的控制台程序):
- // 打开键
- HKEY hKEY;
- LPCTSTR Rgspath = "WinRAR\\shell\\open\\command";
- LONG ret = RegOpenKeyEx(HKEY_CLASSES_ROOT, Rgspath, 0, KEY_READ, &hKEY);
- if(ret != ERROR_SUCCESS)
- {
- RegCloseKey(hKEY);
- return FALSE;
- }
- // 读取键值内容
- DWORD dwInfoSize;
- DWORD type = REG_SZ;
- BYTE UserInfo[255];
- // zjc 08.04.24 added begin
- /*
- 注意RegQueryValueEx最后一个参数是个双向参数,入参时表示的是前一个参数的缓冲区大小,出参时表示的是返回的大小。
- 所以最好把UserInfo的大小给dwInfoSize,防止UserInfo溢出。
- */
- dwInfoSize = sizeof(UserInfo)/sizeof(BYTE);
- ret = RegQueryValueEx(hKEY, NULL, NULL, &type, UserInfo, &dwInfoSize);
- if(ret!=ERROR_SUCCESS)
- {
- LPVOID lpMsgBuf;
- DWORD dw = GetLastError();
- FormatMessage(
- FORMAT_MESSAGE_ALLOCATE_BUFFER |
- FORMAT_MESSAGE_FROM_SYSTEM,
- NULL,
- dw,
- MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
- (LPTSTR) &lpMsgBuf,
- 0, NULL );
- MessageBox((LPCTSTR)lpMsgBuf, "系统错误", MB_OK|MB_ICONSTOP);
- LocalFree(lpMsgBuf);
- RegCloseKey(hKEY);
- return FALSE;
- }
- CString csRarAppPath;
- csRarAppPath.Format("%s",UserInfo);
- int nCount = csRarAppPath.ReverseFind('//');
- csRarAppPath = csRarAppPath.Mid(0,nCount);
- // 关闭键
- RegCloseKey(hKEY);