C技巧(通過注冊表尋找應(yīng)用程序路徑)

字號:

很多時候在調(diào)用一些應(yīng)用程序之前需要先找到應(yīng)用程序的路徑。使用CFileFind類效率較低,考試大提示如果要尋找一些已經(jīng)在注冊表標(biāo)明路徑的應(yīng)用程序,通過注冊表來尋找不失為一個便捷的途徑。下面就是通過注冊表尋找應(yīng)用程序路徑的相關(guān)代碼(以尋找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;
    }
    // 讀取鍵值內(nèi)容
    DWORD dwInfoSize;
    DWORD type = REG_SZ;
    BYTE UserInfo[255];
    // zjc 08.04.24 added begin
    /*
    注意RegQueryValueEx最后一個參數(shù)是個雙向參數(shù),入?yún)r表示的是前一個參數(shù)的緩沖區(qū)大小,出參時表示的是返回的大小。
    所以把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, "系統(tǒng)錯誤", MB_OK|MB_ICONS);
    LocalFree(lpMsgBuf);
    RegCloseKey(hKEY);
    return FALSE;
    }
    CString csRarAppPath;
    csRarAppPath.Format("%s",UserInfo);
    int nCount = csRarAppPath.ReverseFind('\\');
    csRarAppPath = csRarAppPath.Mid(0,nCount);
    // 關(guān)閉鍵
    RegCloseKey(hKEY);