233 lines
6.4 KiB
C++
233 lines
6.4 KiB
C++
//+----------------------------------------------------------------------------
|
|
//
|
|
// Windows NT Active Directory Property Page Sample
|
|
//
|
|
// The code contained in this source file is for demonstration purposes only.
|
|
// No warrantee is expressed or implied and Microsoft disclaims all liability
|
|
// for the consequenses of the use of this source code.
|
|
//
|
|
// Microsoft Windows
|
|
// Copyright (C) Microsoft Corporation, 1992 - 1999
|
|
//
|
|
// File: dllmisc.cxx
|
|
//
|
|
// Contents: AD property page sample class object handler DLL fcns.
|
|
//
|
|
// History: 21-Mar-97 Eric Brown created
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
|
|
#include "page.h"
|
|
|
|
HINSTANCE g_hInstance = NULL;
|
|
ULONG CDll::s_cObjs = 0;
|
|
ULONG CDll::s_cLocks = 0;
|
|
|
|
//+----------------------------------------------------------------------------
|
|
//
|
|
// Function: DllMain
|
|
//
|
|
// Synopsis: Provide a DllMain for Win32
|
|
//
|
|
// Arguments: hInstance - HANDLE to this dll
|
|
// dwReason - Reason this function was called. Can be
|
|
// Process/Thread Attach/Detach.
|
|
//
|
|
// Returns: BOOL - TRUE if no error, FALSE otherwise
|
|
//
|
|
// History: 24-May-95 EricB created.
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
extern "C" INT APIENTRY
|
|
DllMain(HINSTANCE hInstance, DWORD dwReason, PVOID lpReserved)
|
|
{
|
|
switch (dwReason)
|
|
{
|
|
case DLL_PROCESS_ATTACH:
|
|
//
|
|
// Get instance handle
|
|
//
|
|
g_hInstance = hInstance;
|
|
break;
|
|
|
|
case DLL_PROCESS_DETACH:
|
|
break;
|
|
}
|
|
return(TRUE);
|
|
}
|
|
|
|
//+----------------------------------------------------------------------------
|
|
//
|
|
// Function: DllGetClassObject
|
|
//
|
|
// Synopsis: Creates a class factory for the requested object.
|
|
//
|
|
// Arguments: [cid] - the requested class object
|
|
// [iid] - the requested interface
|
|
// [ppvObj] - returned pointer to class object
|
|
//
|
|
// Returns: HRESULTS
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
STDAPI
|
|
DllGetClassObject(REFCLSID cid, REFIID iid, void **ppvObj)
|
|
{
|
|
IUnknown *pUnk = NULL;
|
|
HRESULT hr = S_OK;
|
|
|
|
if (cid != CLSID_SamplePage)
|
|
{
|
|
return E_NOINTERFACE;
|
|
}
|
|
|
|
pUnk = CDsPropPageHostCF::Create();
|
|
if (pUnk != NULL)
|
|
{
|
|
hr = pUnk->QueryInterface(iid, ppvObj);
|
|
pUnk->Release();
|
|
}
|
|
else
|
|
{
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
return hr;
|
|
}
|
|
|
|
//+----------------------------------------------------------------------------
|
|
//
|
|
// Function: DllCanUnloadNow
|
|
//
|
|
// Synopsis: Indicates whether the DLL can be removed if there are no
|
|
// objects in existence.
|
|
//
|
|
// Returns: S_OK or S_FALSE
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
STDAPI
|
|
DllCanUnloadNow(void)
|
|
{
|
|
return CDll::CanUnloadNow();
|
|
}
|
|
|
|
TCHAR const c_szDsProppagesProgID[] = TEXT("ADsSamplePropertyPage");
|
|
TCHAR const c_szServerType[] = TEXT("InProcServer32");
|
|
TCHAR const c_szDsProppagesDllName[] = TEXT("proppage.dll");
|
|
TCHAR const c_szThreadModel[] = TEXT("ThreadingModel");
|
|
TCHAR const c_szThreadModelValue[] = TEXT("Apartment");
|
|
|
|
//+----------------------------------------------------------------------------
|
|
//
|
|
// Function: DllRegisterServer
|
|
//
|
|
// Synopsis: Adds entries to the system registry.
|
|
//
|
|
// Returns: S_OK or S_FALSE
|
|
//
|
|
// Notes: The keys look like this:
|
|
//
|
|
// HKC\CLSID\clsid <No Name> REG_SZ name.progid
|
|
// \InPropServer32 <No Name> : REG_SZ : proppage.dll
|
|
// ThreadingModel : REG_SZ : Apartment
|
|
//-----------------------------------------------------------------------------
|
|
STDAPI
|
|
DllRegisterServer(void)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
HKEY hKeyCLSID, hKeyDsPPClass, hKeySvr;
|
|
|
|
long lRet = RegOpenKeyEx(HKEY_CLASSES_ROOT, TEXT("CLSID"), 0,
|
|
KEY_WRITE, &hKeyCLSID);
|
|
if (lRet != ERROR_SUCCESS)
|
|
{
|
|
return (HRESULT_FROM_WIN32(lRet));
|
|
}
|
|
|
|
LPOLESTR pszCLSID;
|
|
DWORD dwDisposition;
|
|
|
|
hr = StringFromCLSID(CLSID_SamplePage, &pszCLSID);
|
|
|
|
lRet = RegCreateKeyEx(hKeyCLSID, pszCLSID, 0, NULL,
|
|
REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL,
|
|
&hKeyDsPPClass, &dwDisposition);
|
|
|
|
if (lRet != ERROR_SUCCESS)
|
|
{
|
|
hr = HRESULT_FROM_WIN32(lRet);
|
|
return hr;
|
|
}
|
|
|
|
lRet = RegSetValueEx(hKeyDsPPClass, NULL, 0, REG_SZ,
|
|
(CONST BYTE *)c_szDsProppagesProgID,
|
|
sizeof(TCHAR) * (wcslen(c_szDsProppagesProgID) + 1));
|
|
if (lRet != ERROR_SUCCESS)
|
|
{
|
|
RegCloseKey(hKeyDsPPClass);
|
|
hr = HRESULT_FROM_WIN32(lRet);
|
|
return hr;
|
|
}
|
|
|
|
lRet = RegCreateKeyEx(hKeyDsPPClass, c_szServerType, 0, NULL,
|
|
REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL,
|
|
&hKeySvr, &dwDisposition);
|
|
|
|
RegCloseKey(hKeyDsPPClass);
|
|
|
|
if (lRet != ERROR_SUCCESS)
|
|
{
|
|
hr = HRESULT_FROM_WIN32(lRet);
|
|
return hr;
|
|
}
|
|
|
|
lRet = RegSetValueEx(hKeySvr, NULL, 0, REG_SZ,
|
|
(CONST BYTE *)c_szDsProppagesDllName,
|
|
sizeof(TCHAR) * (wcslen(c_szDsProppagesDllName) + 1));
|
|
if (lRet != ERROR_SUCCESS)
|
|
{
|
|
hr = HRESULT_FROM_WIN32(lRet);
|
|
}
|
|
|
|
lRet = RegSetValueEx(hKeySvr, c_szThreadModel, 0, REG_SZ,
|
|
(CONST BYTE *)c_szThreadModelValue,
|
|
sizeof(TCHAR) * (wcslen(c_szThreadModelValue) + 1));
|
|
if (lRet != ERROR_SUCCESS)
|
|
{
|
|
hr = HRESULT_FROM_WIN32(lRet);
|
|
}
|
|
|
|
RegCloseKey(hKeySvr);
|
|
|
|
RegCloseKey(hKeyCLSID);
|
|
|
|
lRet = RegCreateKeyEx(HKEY_CLASSES_ROOT, c_szDsProppagesProgID, 0, NULL,
|
|
REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL,
|
|
&hKeyDsPPClass, &dwDisposition);
|
|
|
|
if (lRet != ERROR_SUCCESS)
|
|
{
|
|
hr = HRESULT_FROM_WIN32(lRet);
|
|
return hr;
|
|
}
|
|
lRet = RegCreateKeyEx(hKeyDsPPClass, L"CLSID", 0, NULL,
|
|
REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL,
|
|
&hKeyCLSID, &dwDisposition);
|
|
|
|
if (lRet != ERROR_SUCCESS)
|
|
{
|
|
hr = HRESULT_FROM_WIN32(lRet);
|
|
return hr;
|
|
}
|
|
lRet = RegSetValueEx(hKeyCLSID, NULL, 0, REG_SZ,
|
|
(CONST BYTE *)pszCLSID,
|
|
sizeof(TCHAR) * (wcslen(pszCLSID) + 1));
|
|
if (lRet != ERROR_SUCCESS)
|
|
{
|
|
hr = HRESULT_FROM_WIN32(lRet);
|
|
return hr;
|
|
}
|
|
CoTaskMemFree(pszCLSID);
|
|
|
|
return hr;
|
|
}
|
|
|