Skip to content

Commit

Permalink
Check registry
Browse files Browse the repository at this point in the history
  • Loading branch information
yukawa committed Oct 17, 2024
1 parent 8c8a446 commit bdf3916
Showing 1 changed file with 44 additions and 0 deletions.
44 changes: 44 additions & 0 deletions src/base/system_util.cc
Original file line number Diff line number Diff line change
Expand Up @@ -409,11 +409,55 @@ class ProgramFilesX86Cache {
HRESULT result_;
std::string path_;
};

constexpr wchar_t kMozcTipClsid[] =
L"SOFTWARE\\Classes\\CLSID\\"
#ifdef GOOGLE_JAPANESE_INPUT_BUILD
L"{D5A86FD5-5308-47EA-AD16-9C4EB160EC3C}"
#else // GOOGLE_JAPANESE_INPUT_BUILD
L"{10A67BC8-22FA-4A59-90DC-2546652C56BF}"
#endif // GOOGLE_JAPANESE_INPUT_BUILD
L"\\InprocServer32";

std::string GetMozcInstallDirFromRegistry() {
// TSF requires the path of "mozc_tip64.dll" to be registered in the registry,
// which tells us Mozc's installation directory.
HKEY key = nullptr;
LSTATUS result =::RegOpenKeyExW(
HKEY_LOCAL_MACHINE, kMozcTipClsid, 0, KEY_READ | KEY_WOW64_64KEY, &key);
if (result != ERROR_SUCCESS) {
return "";
}

DWORD type = 0;
wchar_t buffer[MAX_PATH] = {};
DWORD buffer_size = sizeof(buffer);
result = ::RegQueryValueExW(
key, nullptr, nullptr, &type, reinterpret_cast<LPBYTE>(buffer),
&buffer_size);
::RegCloseKey(key);
if (result != ERROR_SUCCESS || type != REG_SZ) {
return "";
}
const std::string tip64_path = win32::WideToUtf8(buffer);
if (tip64_path.empty()) {
return "";
}
if (!FileUtil::FileExists(tip64_path).ok()) {
return "";
}
return FileUtil::Dirname(tip64_path);
}

} // namespace
#endif // _WIN32

std::string SystemUtil::GetServerDirectory() {
#ifdef _WIN32
const std::string install_dir_from_registry = GetMozcInstallDirFromRegistry();
if (!install_dir_from_registry.empty()) {
return install_dir_from_registry;
}
DCHECK(SUCCEEDED(Singleton<ProgramFilesX86Cache>::get()->result()));
#if defined(GOOGLE_JAPANESE_INPUT_BUILD)
return FileUtil::JoinPath(
Expand Down

0 comments on commit bdf3916

Please sign in to comment.