アプリケーションのインストールパスの取得方法

アプリケーションをインストールするとHKEY_LOCAL_MACHINEのSoftware\\Microsoft\\Windows\\CurrentVersion\\Uninstall
に情報が書き込まれるのでそれを利用してアプリケーションのインストールパスを取得する。
下記のコードはGoogle Earthの場合。

参考:
http://www.alpha-net.ne.jp/users2/uk413/vc/VCT_SDKReg.html
http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200209/02090022.txt

	HKEY hkResult, hkResultEnum;	
	LONG lResult;
	CString strUninstallKey = _T("Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall");
	BOOL bFoundGoogleEarth = FALSE;
	TCHAR enumName[MAX_PATH];
	DWORD dwNameSize = MAX_PATH;
	FILETIME ft;
	CString strValue;
	DWORD dwType;
	DWORD dwSize;

	lResult = ::RegOpenKeyEx(HKEY_LOCAL_MACHINE, strUninstallKey, 0, KEY_ALL_ACCESS, &hkResult);
	if (lResult == ERROR_SUCCESS) {

		for (DWORD enumCount = 0;; ++enumCount) {

			dwNameSize = MAX_PATH;
			lResult = ::RegEnumKeyEx(hkResult, enumCount, enumName, &dwNameSize, NULL, NULL, NULL, &ft);
				
			if (lResult == ERROR_NO_MORE_ITEMS) {
				break;
			}

			ASSERT(lResult == ERROR_SUCCESS);
			if (lResult != ERROR_SUCCESS) {
				continue;
			}

			lResult = ::RegOpenKeyEx(HKEY_LOCAL_MACHINE, strUninstallKey + _T("\\") + enumName,
										0, KEY_ALL_ACCESS, &hkResultEnum);

			ASSERT(lResult == ERROR_SUCCESS);
			if (lResult != ERROR_SUCCESS) {
				continue;
			}

			lResult = ::RegQueryValueEx(hkResultEnum, _T("DisplayName"), NULL, &dwType, NULL, &dwSize);
			if (lResult == ERROR_SUCCESS) {
				lResult = ::RegQueryValueEx(hkResultEnum, _T("DisplayName"), NULL, &dwType,
									(LPBYTE)strValue.GetBuffer(dwSize), &dwSize);
				strValue.ReleaseBuffer();
				ASSERT(lResult == ERROR_SUCCESS);
				if (strValue == _T("Google Earth")) {
					lResult = ::RegQueryValueEx(hkResultEnum, _T("InstallLocation"), NULL, &dwType, NULL, &dwSize);
					ASSERT(lResult == ERROR_SUCCESS);
					lResult = ::RegQueryValueEx(hkResultEnum, _T("InstallLocation"), NULL, &dwType,
										(LPBYTE)strValue.GetBuffer(dwSize), &dwSize);
					strValue.ReleaseBuffer();
					ASSERT(lResult == ERROR_SUCCESS);

					bFoundGoogleEarth = TRUE;
				}
			}

			if (hkResultEnum) {
				::RegCloseKey(hkResultEnum);
				hkResultEnum = 0;
			}

			if (bFoundGoogleEarth) {
				break;
			}
		}

		if (hkResult) {
			::RegCloseKey(hkResult);
			hkResult = 0;
		}
	}

	if (bFoundGoogleEarth) {
		::AfxMessageBox(strValue);
	}