//+--------------------------------------------------------------------------- // // File: regtip.cpp // // Contents: Reister/Unregister TIP functionality. // //---------------------------------------------------------------------------- #include "private.h" #include "regtip.h" // // misc def in Cicero // const TCHAR c_szCTFTIPKey[] = TEXT("SOFTWARE\\Microsoft\\CTF\\TIP\\"); const TCHAR c_szCTFTIPKeyWow6432[] = TEXT("Software\\Wow6432Node\\Microsoft\\CTF\\TIP"); const TCHAR c_szEnable[] = TEXT("Enable"); const WCHAR c_szEnableW[] = L"Enable"; const TCHAR c_szLanguageProfileKey[] = TEXT("LanguageProfile\\"); const WCHAR c_szDescriptionW[] = L"Description"; const WCHAR c_szIconFileW[] = L"IconFile"; const TCHAR c_szIconIndex[] = TEXT("IconIndex"); const TCHAR c_szItem[] = TEXT("Item\\"); // Item to category mapping const TCHAR c_szCategoryKey[] = TEXT("Category\\"); const WCHAR c_wszDescription[] = L"Description"; const TCHAR c_szCategory[] = TEXT("Category\\"); // Category to item mapping const WCHAR c_szMUIDescriptionW[] = L"Display Description"; typedef enum { CAT_FORWARD = 0x0, CAT_BACKWARD = 0x1 } OURCATDIRECTION; // // registry access functions // /* S E T R E G V A L U E */ /*----------------------------------------------------------------------------- -----------------------------------------------------------------------------*/ static BOOL SetRegValue(HKEY hKey, const WCHAR *szName, WCHAR *szValue) { LONG ec; ec = RegSetValueExW(hKey, szName, 0, REG_SZ, (BYTE *)szValue, (lstrlenW(szValue)+1) * sizeof(WCHAR)); return (ec == ERROR_SUCCESS); } /* S E T R E G V A L U E */ /*----------------------------------------------------------------------------- -----------------------------------------------------------------------------*/ static BOOL SetRegValue(HKEY hKey, const CHAR *szName, DWORD dwValue) { LONG ec; ec = RegSetValueExA( hKey, szName, 0, REG_DWORD, (BYTE *)&dwValue, sizeof(DWORD) ); return (ec == ERROR_SUCCESS); } /* D E L E T E R E G K E Y */ /*----------------------------------------------------------------------------- -----------------------------------------------------------------------------*/ static LONG DeleteRegKey( HKEY hKey, const CHAR *szKey ) { HKEY hKeySub; LONG ec = RegOpenKeyEx( hKey, szKey, 0, KEY_READ | KEY_WRITE, &hKeySub ); if (ec != ERROR_SUCCESS) { return ec; } FILETIME time; DWORD dwSize = 256; TCHAR szBuffer[256]; while (RegEnumKeyEx( hKeySub, 0, szBuffer, &dwSize, NULL, NULL, NULL, &time) == ERROR_SUCCESS) { ec = DeleteRegKey( hKeySub, szBuffer ); if (ec != ERROR_SUCCESS) { return ec; } dwSize = 256; } RegCloseKey( hKeySub ); return RegDeleteKey( hKey, szKey ); } /* D E L E T E R E G V A L U E */ /*----------------------------------------------------------------------------- -----------------------------------------------------------------------------*/ static LONG DeleteRegValue( HKEY hKey, const WCHAR *szName ) { LONG ec; ec = RegDeleteValueW( hKey, szName ); return (ec == ERROR_SUCCESS); } // // Input processor profile functions // /* O U R R E G I S T E R */ /*----------------------------------------------------------------------------- private version of CInputProcessorProfiles::Register() (Cicero interface function) -----------------------------------------------------------------------------*/ static HRESULT OurRegister(REFCLSID rclsid) { // --- CInputProcessorProfiles::Register() --- // CMyRegKey key; // TCHAR szKey[256]; // // lstrcpy(szKey, c_szCTFTIPKey); // CLSIDToStringA(rclsid, szKey + lstrlen(szKey)); // // if (key.Create(HKEY_LOCAL_MACHINE, szKey) != S_OK) // return E_FAIL; // // key.SetValueW(L"1", c_szEnableW); // // return S_OK; HKEY hKey; CHAR szKey[ 256 ]; LONG ec; lstrcpy(szKey, c_szCTFTIPKey); CLSIDToStringA(rclsid, szKey + lstrlen(szKey)); ec = RegCreateKeyEx(HKEY_LOCAL_MACHINE, szKey, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey, NULL); if (ec != ERROR_SUCCESS) return E_FAIL; SetRegValue(hKey, c_szEnableW, L"1"); RegCloseKey(hKey); return S_OK; } /* O U R A D D L A N G U A G E P R O F I L E */ /*----------------------------------------------------------------------------- private version of CInputProcessorProfiles::AddLanguageProfile() (Cicero interface function) -----------------------------------------------------------------------------*/ static HRESULT OurAddLanguageProfile( REFCLSID rclsid, LANGID langid, REFGUID guidProfile, const WCHAR *pchProfile, ULONG cch, const WCHAR *pchFile, ULONG cchFile, ULONG uIconIndex) { // --- CInputProcessorProfiles::AddLanguageProfile() --- // CMyRegKey keyTmp; // CMyRegKey key; // char szTmp[256]; // // if (!pchProfile) // return E_INVALIDARG; // // lstrcpy(szTmp, c_szCTFTIPKey); // CLSIDToStringA(rclsid, szTmp + lstrlen(szTmp)); // lstrcat(szTmp, "\\"); // lstrcat(szTmp, c_szLanguageProfileKey); // wsprintf(szTmp + lstrlen(szTmp), "0x%08x", langid); // // if (keyTmp.Create(HKEY_LOCAL_MACHINE, szTmp) != S_OK) // return E_FAIL; // // CLSIDToStringA(guidProfile, szTmp); // if (key.Create(keyTmp, szTmp) != S_OK) // return E_FAIL; // // key.SetValueW(WCHtoWSZ(pchProfile, cch), c_szDescriptionW); // // if (pchFile) // { // key.SetValueW(WCHtoWSZ(pchFile, cchFile), c_szIconFileW); // key.SetValue(uIconIndex, c_szIconIndex); // } // // CAssemblyList::InvalidCache(); // return S_OK; HKEY hKey; HKEY hKeyTmp; LONG ec; CHAR szTmp[256]; WCHAR szProfile[256]; if (!pchProfile) return E_INVALIDARG; lstrcpy(szTmp, c_szCTFTIPKey); CLSIDToStringA(rclsid, szTmp + lstrlen(szTmp)); lstrcat(szTmp, "\\" ); lstrcat(szTmp, c_szLanguageProfileKey); wsprintf(szTmp + lstrlen(szTmp), "0x%08x", langid); ec = RegCreateKeyEx( HKEY_LOCAL_MACHINE, szTmp, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKeyTmp, NULL); if (ec != ERROR_SUCCESS) return E_FAIL; CLSIDToStringA(guidProfile, szTmp); ec = RegCreateKeyEx(hKeyTmp, szTmp, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey, NULL); RegCloseKey(hKeyTmp); if (ec != ERROR_SUCCESS) return E_FAIL; lstrcpynW(szProfile, pchProfile, cch+1); szProfile[cch] = L'\0'; SetRegValue(hKey, c_szDescriptionW, szProfile); if (pchFile) { WCHAR szFile[ MAX_PATH ]; lstrcpynW(szFile, pchFile, cchFile+1); szFile[cchFile] = L'\0'; SetRegValue(hKey, c_szIconFileW, szFile); SetRegValue(hKey, c_szIconIndex, uIconIndex); } RegCloseKey( hKey ); return S_OK; } //+--------------------------------------------------------------------------- // // NumToWDec // //---------------------------------------------------------------------------- static void NumToWDec(DWORD dw, WCHAR *psz) { DWORD dwIndex = 1000000000; BOOL fNum = FALSE; while (dwIndex) { BYTE b = (BYTE)(dw / dwIndex); if (b) fNum = TRUE; if (fNum) { *psz = (WCHAR)(L'0' + b); psz++; } dw %= dwIndex; dwIndex /= 10; } if (!fNum) { *psz = L'0'; psz++; } *psz = L'\0'; return; } //+--------------------------------------------------------------------------- // // OurSetLanguageProfileDisplayName // //---------------------------------------------------------------------------- static HRESULT OurSetLanguageProfileDisplayName(REFCLSID rclsid, LANGID langid, REFGUID guidProfile, const WCHAR *pchFile, ULONG cchFile, ULONG uResId) { HKEY hKeyTmp; HKEY hKey; LONG ec; CHAR szTmp[MAX_PATH]; WCHAR wszTmp[MAX_PATH]; WCHAR wszResId[MAX_PATH]; WCHAR szFile[MAX_PATH]; if (!pchFile) return E_INVALIDARG; lstrcpy(szTmp, c_szCTFTIPKey); CLSIDToStringA(rclsid, szTmp + lstrlen(szTmp)); lstrcat(szTmp, "\\"); lstrcat(szTmp, c_szLanguageProfileKey); wsprintf(szTmp + lstrlen(szTmp), "0x%08x", langid); ec = RegCreateKeyEx(HKEY_LOCAL_MACHINE, szTmp, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKeyTmp, NULL); if (ec != ERROR_SUCCESS) return E_FAIL; CLSIDToStringA(guidProfile, szTmp); ec = RegCreateKeyEx(hKeyTmp, szTmp, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey, NULL); RegCloseKey(hKeyTmp); if (ec != ERROR_SUCCESS) return E_FAIL; // // make "@[filename],-ResId" string // lstrcpyW(wszTmp, L"@"); // WCHtoWSZ(pchFile, cchFile) lstrcpynW(szFile, pchFile, cchFile+1); szFile[cchFile] = L'\0'; lstrcatW(wszTmp, szFile); lstrcatW(wszTmp, L",-"); NumToWDec(uResId, wszResId); lstrcatW(wszTmp, wszResId); SetRegValue(hKey, c_szMUIDescriptionW, wszTmp); RegCloseKey(hKey); return S_OK; } // // Category manager functions // /* O U R G E T C A T K E Y */ /*----------------------------------------------------------------------------- private version of GetCatKey() (Cicero internal function) -----------------------------------------------------------------------------*/ static inline void OurGetCatKey( REFCLSID rclsid, REFGUID rcatid, LPSTR pszKey, LPCSTR pszItem ) { // --- GetCatKey() --- // lstrcpy(pszKey, c_szCTFTIPKey); // CLSIDToStringA(rclsid, pszKey + lstrlen(pszKey)); // lstrcat(pszKey, "\\"); // lstrcat(pszKey, c_szCategoryKey); // lstrcat(pszKey, pszItem); // CLSIDToStringA(rcatid, pszKey + lstrlen(pszKey)); lstrcpy(pszKey, c_szCTFTIPKey); CLSIDToStringA(rclsid, pszKey + lstrlen(pszKey)); lstrcat(pszKey, "\\"); lstrcat(pszKey, c_szCategoryKey); lstrcat(pszKey, pszItem); CLSIDToStringA(rcatid, pszKey + lstrlen(pszKey)); } /* O U R R E G I S T E R G U I D D E S C R I P T I O N */ /*----------------------------------------------------------------------------- private version of RegisterGUIDDescription() (Cicero library function & interface function) -----------------------------------------------------------------------------*/ static HRESULT OurRegisterGUIDDescription( REFCLSID rclsid, REFGUID rcatid, WCHAR *pszDesc ) { // --- RegisterGUIDDescription() --- // ITfCategoryMgr *pcat; // HRESULT hr; // // if (SUCCEEDED(hr = g_pfnCoCreate(CLSID_TF_CategoryMgr, // NULL, // CLSCTX_INPROC_SERVER, // IID_ITfCategoryMgr, // (void**)&pcat))) // { // hr = pcat->RegisterGUIDDescription(rclsid, rcatid, pszDesc, wcslen(pszDesc)); // pcat->Release(); // } // // return hr; // --- CCategoryMgr::RegisterGUIDDescription() --- // return s_RegisterGUIDDescription(rclsid, rguid, WCHtoWSZ(pchDesc, cch)); // --- CCategoryMgr::s_RegisterGUIDDescription() --- // TCHAR szKey[256]; // CMyRegKey key; // // GetCatKey(rclsid, rguid, szKey, c_szItem); // // if (key.Create(HKEY_LOCAL_MACHINE, szKey) != S_OK) // return E_FAIL; // // key.SetValueW(pszDesc, c_wszDescription); // // return S_OK; CHAR szKey[ 256 ]; HKEY hKey; LONG ec; OurGetCatKey( rclsid, rcatid, szKey, c_szItem ); ec = RegCreateKeyEx( HKEY_LOCAL_MACHINE, szKey, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey, NULL); if (ec != ERROR_SUCCESS) return E_FAIL; SetRegValue(hKey, c_wszDescription, pszDesc); RegCloseKey(hKey); return S_OK; } /* O U R I N T E R N A L R E G I S T E R C A T E G O R Y */ /*----------------------------------------------------------------------------- private version of CCategoryMgr::_InternalRegisterCategory() (Cicero interface function) -----------------------------------------------------------------------------*/ static HRESULT OurInternalRegisterCategory( REFCLSID rclsid, REFGUID rcatid, REFGUID rguid, OURCATDIRECTION catdir ) { // --- CCategoryMgr::_InternalRegisterCategory() --- // TCHAR szKey[256]; // CONST TCHAR *pszForward = (catdir == CAT_FORWARD) ? c_szCategory : c_szItem; // CMyRegKey key; // CMyRegKey keySub; // // GetCatKey(rclsid, rcatid, szKey, pszForward); // // if (key.Create(HKEY_LOCAL_MACHINE, szKey) != S_OK) // return E_FAIL; // // // // // we add this guid and save it. // // // char szValue[CLSID_STRLEN + 1]; // CLSIDToStringA(rguid, szValue); // keySub.Create(key, szValue); // _FlushGuidArrayCache(rguid, catdir); // // return S_OK; TCHAR szKey[256]; CONST TCHAR *pszForward = (catdir == CAT_FORWARD) ? c_szCategory : c_szItem; HKEY hKey; HKEY hKeySub; LONG ec; OurGetCatKey(rclsid, rcatid, szKey, pszForward); ec = RegCreateKeyEx( HKEY_LOCAL_MACHINE, szKey, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey, NULL); if (ec != ERROR_SUCCESS) return E_FAIL; char szValue[CLSID_STRLEN + 1]; CLSIDToStringA(rguid, szValue); RegCreateKeyEx( hKey, szValue, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKeySub, NULL); RegCloseKey( hKey ); RegCloseKey( hKeySub ); return S_OK; } /* O U R I N T E R N A L U N R E G I S T E R C A T E G O R Y */ /*----------------------------------------------------------------------------- private version of CCategoryMgr::_InternalUnregisterCategory() (Cicero interface function) -----------------------------------------------------------------------------*/ static HRESULT OurInternalUnregisterCategory( REFCLSID rclsid, REFGUID rcatid, REFGUID rguid, OURCATDIRECTION catdir ) { // --- CCategoryMgr::_InternalUnregisterCategory --- // TCHAR szKey[256]; // CONST TCHAR *pszForward = (catdir == CAT_FORWARD) ? c_szCategory : c_szItem; // CMyRegKey key; // // GetCatKey(rclsid, rcatid, szKey, pszForward); // // if (key.Open(HKEY_LOCAL_MACHINE, szKey) != S_OK) // return E_FAIL; // // DWORD dwIndex = 0; // DWORD dwCnt; // char szValue[CLSID_STRLEN + 1]; // dwCnt = sizeof(szValue); // // CLSIDToStringA(rguid, szValue); // key.RecurseDeleteKey(szValue); // _FlushGuidArrayCache(rguid, catdir); // // return S_OK; CHAR szKey[256]; CONST TCHAR *pszForward = (catdir == CAT_FORWARD) ? c_szCategory : c_szItem; HKEY hKey; LONG ec; OurGetCatKey(rclsid, rcatid, szKey, pszForward); ec = RegOpenKeyEx( HKEY_LOCAL_MACHINE, szKey, 0, KEY_ALL_ACCESS, &hKey ); if (ec != ERROR_SUCCESS) { return E_FAIL; } DWORD dwCnt; char szValue[CLSID_STRLEN + 1]; dwCnt = sizeof(szValue); CLSIDToStringA( rguid, szValue ); DeleteRegKey( hKey, szValue ); // _FlushGuidArrayCache(rguid, catdir); // ^ NOTE: KOJIW: We cannot clear Cicero internal cache from TIP side... RegCloseKey( hKey ); return S_OK; } /* O U R R E G I S T E R T I P */ /*----------------------------------------------------------------------------- private version of RegisterTIP() (Cicero library function) -----------------------------------------------------------------------------*/ BOOL OurRegisterTIP(LPSTR szFilePath, REFCLSID rclsid, WCHAR *pwszDesc, const REGTIPLANGPROFILE *plp) { // --- RegisterTIP() --- // ITfInputProcessorProfiles *pReg = NULL; // HRESULT hr; // // // register ourselves with the ActiveIMM // hr = CoCreateInstance(CLSID_TF_InputProcessorProfiles, NULL, // CLSCTX_INPROC_SERVER, // IID_ITfInputProcessorProfiles, (void**)&pReg); // if (FAILED(hr)) // goto Exit; // // hr = pReg->Register(rclsid); // // if (FAILED(hr)) // goto Exit; // // while (plp->langid) // { // WCHAR wszFilePath[MAX_PATH]; // WCHAR *pv = &wszFilePath[0]; // // wszFilePath[0] = L'\0'; // // if (wcslen(plp->szIconFile)) // { // char szFilePath[MAX_PATH]; // WCHAR *pvCur; // // GetModuleFileName(hInst, szFilePath, ARRAYSIZE(szFilePath)); // wcscpy(wszFilePath, AtoW(szFilePath)); // // pv = pvCur = &wszFilePath[0]; // while (*pvCur) // { // if (*pvCur == L'\\') // pv = pvCur + 1; // pvCur++; // } // *pv = L'\0'; // // } // wcscpy(pv, plp->szIconFile); // // pReg->AddLanguageProfile(rclsid, // plp->langid, // *plp->pguidProfile, // plp->szProfile, // wcslen(plp->szProfile), // wszFilePath, // wcslen(wszFilePath), // plp->uIconIndex); // plp++; // } // // RegisterGUIDDescription(rclsid, rclsid, pwszDesc); //Exit: // SafeRelease(pReg); // return SUCCEEDED(hr); HRESULT hr; hr = OurRegister(rclsid); if (FAILED(hr)) goto Exit; while (plp->langid) { WCHAR wszFilePath[MAX_PATH]; WCHAR *pv = &wszFilePath[0]; wszFilePath[0] = L'\0'; if (wcslen(plp->szIconFile)) { WCHAR *pvCur; MultiByteToWideChar(CP_ACP, 0, szFilePath, -1, wszFilePath, MAX_PATH); pv = pvCur = &wszFilePath[0]; while (*pvCur) { if (*pvCur == L'\\') pv = pvCur + 1; pvCur++; } *pv = L'\0'; } lstrcpyW(pv, plp->szIconFile); OurAddLanguageProfile(rclsid, plp->langid, *plp->pguidProfile, plp->szProfile, lstrlenW(plp->szProfile), wszFilePath, lstrlenW(wszFilePath), plp->uIconIndex); if (plp->uDisplayDescResIndex) { OurSetLanguageProfileDisplayName(rclsid, plp->langid, *plp->pguidProfile, wszFilePath, wcslen(wszFilePath), plp->uDisplayDescResIndex); } plp++; } OurRegisterGUIDDescription( rclsid, rclsid, pwszDesc ); Exit: return SUCCEEDED(hr); } /* O U R R E G I S T E R C A T E G O R Y */ /*----------------------------------------------------------------------------- private versio of RegisterCategory() (Cicero library function) -----------------------------------------------------------------------------*/ HRESULT OurRegisterCategory( REFCLSID rclsid, REFGUID rcatid, REFGUID rguid ) { // --- RegisterCategory() --- // ITfCategoryMgr *pcat; // HRESULT hr; // // if (SUCCEEDED(hr = g_pfnCoCreate(CLSID_TF_CategoryMgr, // NULL, // CLSCTX_INPROC_SERVER, // IID_ITfCategoryMgr, // (void**)&pcat))) // { // hr = pcat->RegisterCategory(rclsid, rcatid, rguid); // pcat->Release(); // } // // return hr; // --- CCategoryMgr::RegisterCategory() --- // return s_RegisterCategory(rclsid, rcatid, rguid); // --- CCategoryMgr::s_RegisterGUIDDescription() --- // HRESULT hr; // // // // // create forward link from category to guids. // // // if (FAILED(hr = _InternalRegisterCategory(rclsid, rcatid, rguid, CAT_FORWARD))) // return hr; // // // // // create backward link from guid to categories. // // // if (FAILED(hr = _InternalRegisterCategory(rclsid, rguid, rcatid, CAT_BACKWARD))) // { // _InternalUnregisterCategory(rclsid, rcatid, rguid, CAT_FORWARD); // return hr; // } // // return S_OK; HRESULT hr; if (FAILED(hr = OurInternalRegisterCategory(rclsid, rcatid, rguid, CAT_FORWARD))) { return hr; } if (FAILED(hr = OurInternalRegisterCategory(rclsid, rguid, rcatid, CAT_BACKWARD))) { OurInternalUnregisterCategory(rclsid, rcatid, rguid, CAT_FORWARD); return hr; } return S_OK; } /* O U R U N R E G I S T E R C A T E G O R Y */ /*----------------------------------------------------------------------------- private version of UnregisterCategory() (Cicero library function) -----------------------------------------------------------------------------*/ HRESULT OurUnregisterCategory( REFCLSID rclsid, REFGUID rcatid, REFGUID rguid ) { // --- UnregisterCategory() --- // ITfCategoryMgr *pcat; // HRESULT hr; // // if (SUCCEEDED(hr = g_pfnCoCreate(CLSID_TF_CategoryMgr, // NULL, // CLSCTX_INPROC_SERVER, // IID_ITfCategoryMgr, // (void**)&pcat))) // { // hr = pcat->UnregisterCategory(rclsid, rcatid, rguid); // pcat->Release(); // } // // return hr; // --- CCategoryMgr::UnregisterCategory() --- // return s_UnregisterCategory(rclsid, rcatid, rguid); // --- CCategoryMgr::s_UnregisterCategory() --- // HRESULT hr; // // // // // remove forward link from category to guids. // // // if (FAILED(hr = _InternalUnregisterCategory(rclsid, rcatid, rguid, CAT_FORWARD))) // return hr; // // // // // remove backward link from guid to categories. // // // if (FAILED(hr = _InternalUnregisterCategory(rclsid, rguid, rcatid, CAT_BACKWARD))) // { // _InternalRegisterCategory(rclsid, rcatid, rguid, CAT_FORWARD); // return hr; // } // // return S_OK; HRESULT hr; if (FAILED(hr = OurInternalUnregisterCategory(rclsid, rcatid, rguid, CAT_FORWARD))) { return hr; } if (FAILED(hr = OurInternalUnregisterCategory(rclsid, rguid, rcatid, CAT_BACKWARD))) { OurInternalRegisterCategory(rclsid, rcatid, rguid, CAT_FORWARD); return hr; } return S_OK; } /* O U R R E G I S T E R C A T E G O R I E S */ /*----------------------------------------------------------------------------- private version of RegisterCategories() (Cicero library function) -----------------------------------------------------------------------------*/ HRESULT OurRegisterCategories( REFCLSID rclsid, const REGISTERCAT *pregcat ) { // --- RegisterCategories() --- // while (pregcat->pcatid) // { // if (FAILED(RegisterCategory(rclsid, *pregcat->pcatid, *pregcat->pguid))) // return E_FAIL; // pregcat++; // } // return S_OK; while (pregcat->pcatid) { if (FAILED(OurRegisterCategory(rclsid, *pregcat->pcatid, *pregcat->pguid))) { return E_FAIL; } pregcat++; } return S_OK; } //+--------------------------------------------------------------------------- // // InitProfileRegKeyStr // //---------------------------------------------------------------------------- static BOOL InitProfileRegKeyStr(char *psz, REFCLSID rclsid, LANGID langid, REFGUID guidProfile) { lstrcpy(psz, c_szCTFTIPKey); CLSIDToStringA(rclsid, psz + lstrlen(psz)); lstrcat(psz, "\\"); lstrcat(psz, c_szLanguageProfileKey); wsprintf(psz + lstrlen(psz), "0x%08x", langid); lstrcat(psz, "\\"); CLSIDToStringA(guidProfile, psz + lstrlen(psz)); return TRUE; } HRESULT OurEnableLanguageProfileByDefault(REFCLSID rclsid, LANGID langid, REFGUID guidProfile, BOOL fEnable) { HKEY hKey; char szTmp[256]; LONG ec; if (!InitProfileRegKeyStr(szTmp, rclsid, langid, guidProfile)) return E_FAIL; ec = RegCreateKeyEx(HKEY_LOCAL_MACHINE, szTmp, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey, NULL); if (ec != ERROR_SUCCESS) return E_FAIL; SetRegValue(hKey, c_szEnable, (DWORD)(fEnable ? 1 : 0)); RegCloseKey(hKey); return S_OK; }