You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
304 lines
7.4 KiB
304 lines
7.4 KiB
//+----------------------------------------------------------------------------
|
|
// File: dllreg.cxx
|
|
//
|
|
// Synopsis:
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
|
// Includes -------------------------------------------------------------------
|
|
#include <core.hxx>
|
|
|
|
|
|
// 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;
|
|
}
|