//+---------------------------------------------------------------------------- // File: dllreg.cxx // // Synopsis: // //----------------------------------------------------------------------------- // Includes ------------------------------------------------------------------- #include // Prototypes ----------------------------------------------------------------- static const TCHAR * DeleteSubkeys(HKEY hkeyParent, const TCHAR * pszKey); static const TCHAR * RegisterKey(HKEY hkeyParent, const TCHAR * pszKey); //+---------------------------------------------------------------------------- // Function: DllRegisterServer // // Synopsis: // //----------------------------------------------------------------------------- STDAPI DllRegisterServer() { const TCHAR ** ppszKey; const TCHAR * pszKey; HKEY hkey; LONG lError; HRESULT hr; hr = EnsureThreadState(); if (hr) goto Cleanup; for (ppszKey=g_aszKeys; *ppszKey; ppszKey++) { pszKey = *ppszKey; lError = ::RegOpenKeyEx(HKEY_CLASSES_ROOT, pszKey, 0, KEY_ALL_ACCESS, &hkey); if (lError != ERROR_SUCCESS) { hr = E_FAIL; break; } pszKey += _tcslen(pszKey) + 1; Assert(*pszKey); if (!RegisterKey(hkey, pszKey)) { hr = E_FAIL; break; } #ifdef _DEBUG Verify(::RegCloseKey(hkey) == ERROR_SUCCESS); #else ::RegCloseKey(hkey); #endif } Cleanup: return hr; } //+---------------------------------------------------------------------------- // Function: DllUnregisterServer // // Synopsis: // //----------------------------------------------------------------------------- STDAPI DllUnregisterServer() { const TCHAR ** ppszKey; const TCHAR * pszKey; HKEY hkey; LONG lError; HRESULT hr; hr = EnsureThreadState(); if (hr) goto Cleanup; for (ppszKey=g_aszKeys; *ppszKey; ppszKey++) { pszKey = *ppszKey; lError = ::RegOpenKeyEx(HKEY_CLASSES_ROOT, pszKey, 0, KEY_ALL_ACCESS, &hkey); if (lError != ERROR_SUCCESS) { hr = E_FAIL; break; } pszKey += _tcslen(pszKey) + 1; Assert(*pszKey); if (!DeleteSubkeys(hkey, pszKey) || ::RegDeleteKey(hkey, pszKey) != ERROR_SUCCESS) { hr = E_FAIL; } #ifdef _DEBUG Verify(::RegCloseKey(hkey) == ERROR_SUCCESS); #else ::RegCloseKey(hkey); #endif if (hr) goto Cleanup; } Cleanup: return hr; } //+---------------------------------------------------------------------------- // Function: DeleteSubkeys // // Synopsis: // //----------------------------------------------------------------------------- const TCHAR * DeleteSubkeys( HKEY hkeyParent, const TCHAR * pszKey) { const TCHAR * psz; HKEY hkey = NULL; LONG lError; lError = ::RegOpenKeyEx(hkeyParent, pszKey, 0, KEY_ALL_ACCESS, &hkey); if (lError != ERROR_SUCCESS) goto Error; pszKey += _tcslen(pszKey) + 1; while (*pszKey) { switch (*pszKey) { case chDEFAULT_SECTION: pszKey++; pszKey += _tcslen(pszKey) + 1; break; case chVALUES_SECTION: pszKey++; while (*pszKey) { pszKey += _tcslen(pszKey) + 1; pszKey += _tcslen(pszKey) + 1; } pszKey++; break; case chSUBKEY_SECTION: pszKey++; psz = pszKey; pszKey = DeleteSubkeys(hkey, pszKey); if (!pszKey) goto Error; lError = ::RegDeleteKey(hkey, psz); if (lError != ERROR_SUCCESS) goto Error; break; #ifdef _DEBUG default: AssertF("Invalid section in registry key data"); #endif } } pszKey++; Cleanup: if (hkey) { #ifdef _DEBUG Verify(::RegCloseKey(hkey) == ERROR_SUCCESS); #else ::RegCloseKey(hkey); #endif } return pszKey; Error: pszKey = NULL; goto Cleanup; } //+---------------------------------------------------------------------------- // Function: RegisterKey // // Synopsis: // //----------------------------------------------------------------------------- const TCHAR * RegisterKey( HKEY hkeyParent, const TCHAR * pszKey) { const TCHAR * psz; HKEY hkey = NULL; DWORD dwDisposition; LONG lError; lError = ::RegCreateKeyEx(hkeyParent, pszKey, 0, _T(""), REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hkey, &dwDisposition); if (lError != ERROR_SUCCESS) goto Error; pszKey += _tcslen(pszKey) + 1; while (*pszKey) { switch (*pszKey) { case chDEFAULT_SECTION: pszKey++; if (!::lstrcmpi(pszKey, szMODULE_PATH)) { TCHAR szModule[MAX_PATH+1]; Verify(::GetModuleFileName((HMODULE)g_hinst, szModule, ARRAY_SIZE(szModule))); lError = ::RegSetValueEx(hkey, NULL, 0, REG_SZ, (const BYTE *)szModule, sizeof(TCHAR) * (_tcslen(szModule) + 1)); } else { lError = ::RegSetValueEx(hkey, NULL, 0, REG_SZ, (const BYTE *)pszKey, sizeof(TCHAR) * (_tcslen(pszKey) + 1)); } if (lError != ERROR_SUCCESS) goto Error; pszKey += _tcslen(pszKey) + 1; break; case chVALUES_SECTION: pszKey++; while (*pszKey) { psz = pszKey; pszKey += _tcslen(pszKey) + 1; lError = ::RegSetValueEx(hkey, psz, 0, REG_SZ, (const BYTE *)pszKey, sizeof(TCHAR) * (_tcslen(pszKey) + 1)); if (lError != ERROR_SUCCESS) goto Error; pszKey += _tcslen(pszKey) + 1; } pszKey++; break; case chSUBKEY_SECTION: pszKey++; pszKey = RegisterKey(hkey, pszKey); if (!pszKey) goto Error; break; #ifdef _DEBUG default: AssertF("Invalid section in registry key data"); #endif } } pszKey++; Cleanup: if (hkey) { #ifdef _DEBUG Verify(::RegCloseKey(hkey) == ERROR_SUCCESS); #else ::RegCloseKey(hkey); #endif } return pszKey; Error: pszKey = NULL; goto Cleanup; }