//+--------------------------------------------------------------------------- // // Microsoft Windows // Copyright (C) Microsoft Corporation, 1996 - 2001. // // File: regutil.cxx // // Contents: Functions supporting class registration // // History: 25 Oct 1996 Alanw Created // //---------------------------------------------------------------------------- #include "pch.cxx" #pragma hdrstop #include "regutil.h" #define GUID_SIZE 128 //+--------------------------------------------------------------------------- // // Function: _DllRegisterServer - public // // Synopsis: Installs a class registration for an inproc server // // Arguments: [hInst] -- HINSTANCE of DLL to be installed // [pwszProgId] -- program ID (class name) // [clsid] -- Class ID of class // [pwszDescription] -- description of class // [pwszCurVer] -- if non-NULL, current version // // Returns: SCODE - status of registration // // History: 03 Jan 1997 Alanw Added header // // NTRAID#DB-NTBUG9-84747-2000/07/31-dlee No transaction / Rollback semantics for DLL registration of IXSSO // //---------------------------------------------------------------------------- STDAPI _DllRegisterServer(HINSTANCE hInst, LPWSTR pwszProgId, REFCLSID clsid, LPWSTR pwszDescription, LPWSTR pwszCurVer) { HKEY hKey; WCHAR wcsSubKey[MAX_PATH+1]; WCHAR wcsClsId[GUID_SIZE+1]; StringFromGUID2(clsid, wcsClsId, sizeof(wcsClsId) / sizeof WCHAR); LONG r = RegCreateKey(HKEY_CLASSES_ROOT, pwszProgId, &hKey); if ( ERROR_SUCCESS != r ) return HRESULT_FROM_WIN32( r ); r = RegSetValue(hKey, NULL, REG_SZ, pwszDescription, wcslen(pwszDescription) * sizeof (WCHAR)); RegCloseKey(hKey); if ( ERROR_SUCCESS != r ) return HRESULT_FROM_WIN32( r ); wsprintf(wcsSubKey, L"%ws\\CLSID", pwszProgId); r = RegCreateKey(HKEY_CLASSES_ROOT, wcsSubKey, &hKey); if ( ERROR_SUCCESS != r ) return HRESULT_FROM_WIN32( r ); r = RegSetValue(hKey, NULL, REG_SZ, wcsClsId, wcslen(wcsClsId) * sizeof (WCHAR)); RegCloseKey(hKey); if ( ERROR_SUCCESS != r ) return HRESULT_FROM_WIN32( r ); if ( pwszCurVer ) { wsprintf(wcsSubKey, L"%ws\\CurVer", pwszProgId); r = RegCreateKey(HKEY_CLASSES_ROOT, wcsSubKey, &hKey); if ( ERROR_SUCCESS != r ) return HRESULT_FROM_WIN32( r ); r = RegSetValue(hKey, NULL, REG_SZ, pwszCurVer, wcslen(pwszCurVer) * sizeof (WCHAR)); RegCloseKey(hKey); if ( ERROR_SUCCESS != r ) return HRESULT_FROM_WIN32( r ); } wsprintf(wcsSubKey, L"CLSID\\%ws", wcsClsId); r = RegCreateKey(HKEY_CLASSES_ROOT, wcsSubKey, &hKey); if ( ERROR_SUCCESS != r ) return HRESULT_FROM_WIN32( r ); r = RegSetValue(hKey, NULL, REG_SZ, pwszDescription, wcslen(pwszDescription) * sizeof (WCHAR)); RegCloseKey(hKey); if ( ERROR_SUCCESS != r ) return HRESULT_FROM_WIN32( r ); wsprintf(wcsSubKey, L"CLSID\\%ws\\InProcServer32", wcsClsId); r = RegCreateKey(HKEY_CLASSES_ROOT, wcsSubKey, &hKey); if ( ERROR_SUCCESS != r ) return HRESULT_FROM_WIN32( r ); GetModuleFileName(hInst, wcsSubKey, MAX_PATH); r = RegSetValue(hKey, NULL, REG_SZ, wcsSubKey, wcslen(wcsSubKey) * sizeof (WCHAR)); if ( ERROR_SUCCESS != r ) return HRESULT_FROM_WIN32( r ); wcscpy(wcsSubKey, L"Both"); r = RegSetValueEx(hKey, L"ThreadingModel", NULL, REG_SZ, (BYTE*)wcsSubKey, wcslen(wcsSubKey) * sizeof (WCHAR)); RegCloseKey(hKey); if ( ERROR_SUCCESS != r ) return HRESULT_FROM_WIN32( r ); wsprintf(wcsSubKey, L"CLSID\\%ws\\ProgID", wcsClsId); r = RegCreateKey(HKEY_CLASSES_ROOT, wcsSubKey, &hKey); if ( ERROR_SUCCESS != r ) return HRESULT_FROM_WIN32( r ); r = RegSetValue(hKey, NULL, REG_SZ, pwszProgId, wcslen(pwszProgId) * sizeof (WCHAR)); RegCloseKey(hKey); if ( ERROR_SUCCESS != r ) return HRESULT_FROM_WIN32( r ); // // Indicate the object is 'safely' initializable and scriptable // wsprintf(wcsSubKey, L"CLSID\\%ws\\Implemented Categories", wcsClsId); r = RegCreateKey(HKEY_CLASSES_ROOT, wcsSubKey, &hKey); if ( ERROR_SUCCESS != r ) return HRESULT_FROM_WIN32( r ); RegCloseKey(hKey); wsprintf(wcsSubKey, L"CLSID\\%ws\\Implemented Categories\\{7DD95801-9882-11CF-9FA9-00AA006C42C4}", wcsClsId); r = RegCreateKey(HKEY_CLASSES_ROOT, wcsSubKey, &hKey); if ( ERROR_SUCCESS != r ) return HRESULT_FROM_WIN32( r ); RegCloseKey(hKey); wsprintf(wcsSubKey, L"CLSID\\%ws\\Implemented Categories\\{7DD95802-9882-11CF-9FA9-00AA006C42C4}", wcsClsId); r = RegCreateKey(HKEY_CLASSES_ROOT, wcsSubKey, &hKey); if ( ERROR_SUCCESS != r ) return HRESULT_FROM_WIN32( r ); RegCloseKey(hKey); return S_OK; } //+--------------------------------------------------------------------------- // // Function: _DllUnregisterServer - public // // Synopsis: Uninstalls a class registration for an inproc server // // Arguments: [pwszProgId] -- program ID (class name) // [clsid] -- Class ID of class // // Returns: SCODE - status of de-registration // // History: 03 Jan 1997 Alanw Added header // //---------------------------------------------------------------------------- STDAPI _DllUnregisterServer(LPWSTR pwszProgID, REFCLSID clsid) { // // Ignore errors -- do a best effort to uninstall since we don't know // what shape the registry is in. // WCHAR wcsClsId[GUID_SIZE+1]; StringFromGUID2(clsid, wcsClsId, sizeof(wcsClsId) / sizeof WCHAR); WCHAR wcsSubKey[256]; wsprintf(wcsSubKey, L"%ws\\CLSID", pwszProgID); RegDeleteKey(HKEY_CLASSES_ROOT, wcsSubKey); wsprintf(wcsSubKey, L"%ws\\CurVer", pwszProgID); RegDeleteKey(HKEY_CLASSES_ROOT, wcsSubKey); RegDeleteKey(HKEY_CLASSES_ROOT, pwszProgID); wsprintf(wcsSubKey, L"CLSID\\%ws\\InProcServer32", wcsClsId); RegDeleteKey(HKEY_CLASSES_ROOT, wcsSubKey); wsprintf(wcsSubKey, L"CLSID\\%ws\\ProgID", wcsClsId); RegDeleteKey(HKEY_CLASSES_ROOT, wcsSubKey); wsprintf(wcsSubKey, L"CLSID\\%ws\\Implemented Categories\\{7DD95801-9882-11CF-9FA9-00AA006C42C4}", wcsClsId); RegDeleteKey(HKEY_CLASSES_ROOT, wcsSubKey); wsprintf(wcsSubKey, L"CLSID\\%ws\\Implemented Categories\\{7DD95802-9882-11CF-9FA9-00AA006C42C4}", wcsClsId); RegDeleteKey(HKEY_CLASSES_ROOT, wcsSubKey); wsprintf(wcsSubKey, L"CLSID\\%ws\\Implemented Categories", wcsClsId); RegDeleteKey(HKEY_CLASSES_ROOT, wcsSubKey); wsprintf(wcsSubKey, L"CLSID\\%ws", wcsClsId); RegDeleteKey(HKEY_CLASSES_ROOT, wcsSubKey); return S_OK; }