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