很多时候在调用一些应用程序之前需要先找到应用程序的路径。使用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); www.Examda.CoM
|