244 lines
5.8 KiB
C++
244 lines
5.8 KiB
C++
//=================================================================
|
|
|
|
//
|
|
|
|
// DllUnreg.cpp
|
|
|
|
//
|
|
|
|
// Copyright (c) 2000-2001 Microsoft Corporation, All Rights Reserved
|
|
//
|
|
//=================================================================
|
|
#include "precomp.h"
|
|
extern HMODULE ghModule ;
|
|
|
|
//***************************************************************************
|
|
//
|
|
// UnregisterServer
|
|
//
|
|
// Given a clsid, remove the com registration
|
|
//
|
|
//***************************************************************************
|
|
|
|
HRESULT UnregisterServer( REFGUID a_rguid )
|
|
{
|
|
WCHAR wcID[128];
|
|
TCHAR szCLSID[128];
|
|
TCHAR szProviderCLSIDAppID[128];
|
|
HKEY hKey;
|
|
|
|
// Create the path using the CLSID
|
|
|
|
StringFromGUID2( a_rguid, wcID, 128);
|
|
lstrcpy(szCLSID, TEXT("SOFTWARE\\CLASSES\\CLSID\\"));
|
|
_tcscpy(szProviderCLSIDAppID, TEXT("SOFTWARE\\CLASSES\\APPID\\"));
|
|
|
|
#ifndef _UNICODE
|
|
|
|
char szID[128];
|
|
wcstombs(szID, wcID, 128);
|
|
lstrcat(szCLSID, szID);
|
|
_tcscat(szProviderCLSIDAppID, szID);
|
|
|
|
#else
|
|
|
|
lstrcat(szCLSID, wcID);
|
|
_tcscat(szProviderCLSIDAppID, wcID);
|
|
|
|
#endif
|
|
|
|
DWORD dwRet ;
|
|
|
|
//Delete entries under APPID
|
|
|
|
dwRet = RegDeleteKey(HKEY_LOCAL_MACHINE, szProviderCLSIDAppID);
|
|
|
|
dwRet = RegOpenKey(HKEY_LOCAL_MACHINE, szCLSID, &hKey);
|
|
if(dwRet == NO_ERROR)
|
|
{
|
|
dwRet = RegDeleteKey(hKey, _T("InProcServer32") );
|
|
dwRet = RegDeleteKey(hKey, _T("LocalServer32"));
|
|
CloseHandle(hKey);
|
|
}
|
|
|
|
dwRet = RegDeleteKeyW(HKEY_LOCAL_MACHINE, szCLSID);
|
|
|
|
return NOERROR;
|
|
}
|
|
|
|
//***************************************************************************
|
|
//
|
|
// Is4OrMore
|
|
//
|
|
// Returns true if win95 or any version of NT > 3.51
|
|
//
|
|
//***************************************************************************
|
|
|
|
BOOL Is4OrMore ()
|
|
{
|
|
OSVERSIONINFO os;
|
|
os.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
|
|
|
|
if ( ! GetVersionEx ( & os ) )
|
|
{
|
|
return FALSE; // should never happen
|
|
}
|
|
|
|
return os.dwMajorVersion >= 4;
|
|
}
|
|
|
|
/***************************************************************************
|
|
* SetKeyAndValue
|
|
*
|
|
* Purpose:
|
|
* Private helper function for DllRegisterServer that creates
|
|
* a key, sets a value, and closes that key.
|
|
*
|
|
* Parameters:
|
|
* pszKey LPTSTR to the ame of the key
|
|
* pszSubkey LPTSTR ro the name of a subkey
|
|
* pszValue LPTSTR to the value to store
|
|
*
|
|
* Return Value:
|
|
* BOOL TRUE if successful, FALSE otherwise.
|
|
***************************************************************************/
|
|
|
|
BOOL SetKeyAndValue (
|
|
|
|
wchar_t *pszKey,
|
|
wchar_t *pszSubkey,
|
|
wchar_t *pszValueName,
|
|
wchar_t *pszValue
|
|
)
|
|
{
|
|
HKEY hKey;
|
|
TCHAR szKey[256];
|
|
|
|
_tcscpy(szKey, pszKey);
|
|
|
|
if (NULL!=pszSubkey)
|
|
{
|
|
_tcscat(szKey, _T("\\"));
|
|
_tcscat(szKey, pszSubkey);
|
|
}
|
|
|
|
if (ERROR_SUCCESS!=RegCreateKeyEx(HKEY_LOCAL_MACHINE
|
|
, szKey, 0, NULL, REG_OPTION_NON_VOLATILE
|
|
, KEY_ALL_ACCESS, NULL, &hKey, NULL))
|
|
return FALSE;
|
|
|
|
if (NULL!=pszValue)
|
|
{
|
|
if (ERROR_SUCCESS != RegSetValueEx(hKey, (LPCTSTR)pszValueName, 0, REG_SZ, (BYTE *)(LPCTSTR)pszValue
|
|
, (_tcslen(pszValue)+1)*sizeof(TCHAR)))
|
|
return FALSE;
|
|
}
|
|
|
|
RegCloseKey(hKey);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
//***************************************************************************
|
|
//
|
|
// RegisterServer
|
|
//
|
|
// Given a clsid and a description, perform the com registration
|
|
//
|
|
//***************************************************************************
|
|
|
|
HRESULT RegisterServer (
|
|
|
|
TCHAR *a_pName,
|
|
REFGUID a_rguid
|
|
)
|
|
{
|
|
WCHAR wcID[128];
|
|
TCHAR szCLSID[128];
|
|
TCHAR szModule[MAX_PATH];
|
|
TCHAR * pName = _T("WBEM Framework Instance Provider");
|
|
TCHAR * pModel;
|
|
HKEY hKey1;
|
|
|
|
GetModuleFileName(ghModule, szModule, MAX_PATH);
|
|
|
|
// Normally we want to use "Both" as the threading model since
|
|
// the DLL is free threaded, but NT 3.51 Ole doesnt work unless
|
|
// the model is "Aparment"
|
|
|
|
if(Is4OrMore())
|
|
pModel = _T("Both") ;
|
|
else
|
|
pModel = _T("Apartment") ;
|
|
|
|
// Create the path.
|
|
|
|
StringFromGUID2(a_rguid, wcID, 128);
|
|
lstrcpy(szCLSID, TEXT("SOFTWARE\\CLASSES\\CLSID\\"));
|
|
|
|
#ifndef _UNICODE
|
|
|
|
TCHAR szID[128];
|
|
wcstombs(szID, wcID, 128);
|
|
lstrcat(szCLSID, szID);
|
|
|
|
#else
|
|
|
|
lstrcat(szCLSID, wcID);
|
|
|
|
#endif
|
|
|
|
#ifdef LOCALSERVER
|
|
|
|
TCHAR szProviderCLSIDAppID[128];
|
|
_tcscpy(szProviderCLSIDAppID,TEXT("SOFTWARE\\CLASSES\\APPID\\"));
|
|
|
|
#ifndef _UNICODE
|
|
|
|
TCHAR szAPPID[128];
|
|
wcstombs(szProviderCLSIDAppID, wcID, 128);
|
|
lstrcat(szProviderCLSIDAppID, szID);
|
|
|
|
#else
|
|
|
|
lstrcat(szProviderCLSIDAppID, wcID);
|
|
|
|
#endif
|
|
|
|
if (FALSE ==SetKeyAndValue(szProviderCLSIDAppID, NULL, NULL, a_pName ))
|
|
return SELFREG_E_CLASS;
|
|
#endif
|
|
|
|
// Create entries under CLSID
|
|
|
|
RegCreateKey(HKEY_LOCAL_MACHINE, szCLSID, &hKey1);
|
|
|
|
RegSetValueEx(hKey1, NULL, 0, REG_SZ, (BYTE *)a_pName, (lstrlen(a_pName)+1) *
|
|
sizeof(TCHAR));
|
|
|
|
|
|
#ifdef LOCALSERVER
|
|
|
|
if (FALSE ==SetKeyAndValue(szCLSID, _T("LocalServer32"), NULL,szModule))
|
|
return SELFREG_E_CLASS;
|
|
|
|
if (FALSE ==SetKeyAndValue(szCLSID, _T("LocalServer32"),_T("ThreadingModel"), pModel))
|
|
return SELFREG_E_CLASS;
|
|
#else
|
|
|
|
HKEY hKey2 ;
|
|
RegCreateKey(hKey1, _T("InprocServer32"), &hKey2);
|
|
|
|
RegSetValueEx(hKey2, NULL, 0, REG_SZ, (BYTE *)szModule,
|
|
(lstrlen(szModule)+1) * sizeof(TCHAR));
|
|
RegSetValueEx(hKey2, _T("ThreadingModel"), 0, REG_SZ,
|
|
(BYTE *)pModel, (lstrlen(pModel)+1) * sizeof(TCHAR));
|
|
|
|
CloseHandle(hKey2);
|
|
|
|
#endif
|
|
|
|
CloseHandle(hKey1);
|
|
return NOERROR;
|
|
}
|