|
|
#include "mslocusr.h"
#include "msluglob.h"
STDMETHODIMP CLUClassFactory::QueryInterface( /* [in] */ REFIID riid, /* [out] */ void __RPC_FAR *__RPC_FAR *ppvObject) { *ppvObject = NULL;
if (IsEqualIID(riid, IID_IUnknown) || IsEqualIID(riid, IID_IClassFactory)) { *ppvObject = (LPVOID)this; AddRef(); return NOERROR; } return ResultFromScode(E_NOINTERFACE); }
STDMETHODIMP_(ULONG) CLUClassFactory::AddRef(void) { RefThisDLL(TRUE);
return 1; }
STDMETHODIMP_(ULONG) CLUClassFactory::Release(void) { RefThisDLL(FALSE);
return 1; }
HRESULT CreateUserDatabase(REFIID riid, void **ppOut) { CLUDatabase *pObj = new CLUDatabase;
if (NULL == pObj) return ResultFromScode(E_OUTOFMEMORY);
HRESULT hr = pObj->QueryInterface(riid, ppOut);
if (FAILED(hr)) { delete pObj; } else { pObj->AddRef(); }
return NOERROR; }
STDMETHODIMP CLUClassFactory::CreateInstance( /* [unique][in] */ IUnknown __RPC_FAR *pUnkOuter, /* [in] */ REFIID riid, /* [out] */ void __RPC_FAR *__RPC_FAR *ppvObject) { if (NULL != pUnkOuter) return ResultFromScode(CLASS_E_NOAGGREGATION);
return CreateUserDatabase(riid, ppvObject); }
STDMETHODIMP CLUClassFactory::LockServer( /* [in] */ BOOL fLock) { LockThisDLL(fLock);
return NOERROR; }
/* This function signals our stub NP DLL in MPREXE's context to load or
* unload MSLOCUSR as a net provider DLL. This way, when we uninstall, * DllUnregisterServer can get MSLOCUSR unloaded from MPREXE's process * space, so it can be deleted and upgraded. Then, DllRegisterServer * will tell the stub NP to reload MSLOCUSR again. */ void SignalStubNP(BOOL fLoad) { HWND hwnd = FindWindow("WndClass_NPSTUBMonitor", NULL); if (hwnd != NULL) { SendMessage(hwnd, fLoad ? WM_USER : (WM_USER+1), 0, 0); } }
extern "C" {
STDAPI DllRegisterServer(void) { HKEY hkeyCLSID; HKEY hkeyOurs; HKEY hkeyInproc; LONG err;
err = ::RegOpenKey(HKEY_CLASSES_ROOT, ::szCLSID, &hkeyCLSID); if (err == ERROR_SUCCESS) { err = ::RegCreateKey(hkeyCLSID, ::szOurCLSID, &hkeyOurs); if (err == ERROR_SUCCESS) { err = ::RegCreateKey(hkeyOurs, ::szINPROCSERVER32, &hkeyInproc); if (err == ERROR_SUCCESS) { err = ::RegSetValueEx(hkeyInproc, NULL, 0, REG_EXPAND_SZ, (LPBYTE)::szDLLNAME, ::strlenf(::szDLLNAME)); if (err == ERROR_SUCCESS) { err = ::RegSetValueEx(hkeyInproc, ::szTHREADINGMODEL, 0, REG_SZ, (LPBYTE)::szAPARTMENT, ::strlenf(::szAPARTMENT)); } ::RegCloseKey(hkeyInproc); }
::RegCloseKey(hkeyOurs); }
::RegCloseKey(hkeyCLSID); }
if (err == ERROR_SUCCESS) return S_OK; else return HRESULT_FROM_WIN32(err); }
STDAPI DllUnregisterServer(void) { HKEY hkeyCLSID; HKEY hkeyOurs; LONG err;
err = ::RegOpenKey(HKEY_CLASSES_ROOT, ::szCLSID, &hkeyCLSID); if (err == ERROR_SUCCESS) { err = ::RegOpenKey(hkeyCLSID, ::szOurCLSID, &hkeyOurs); if (err == ERROR_SUCCESS) { err = ::RegDeleteKey(hkeyOurs, ::szINPROCSERVER32);
::RegCloseKey(hkeyOurs);
if (err == ERROR_SUCCESS) err = ::RegDeleteKey(hkeyCLSID, ::szOurCLSID); }
::RegCloseKey(hkeyCLSID); }
DeinstallLogonDialog();
if (err == ERROR_SUCCESS) return S_OK; else return HRESULT_FROM_WIN32(err); }
STDAPI DllInstall(BOOL fInstall, LPCSTR psz) { SignalStubNP(fInstall); return S_OK; }
STDAPI DllCanUnloadNow(void) { SCODE sc;
sc = (0 == g_cRefThisDll && 0 == g_cLocks) ? S_OK : S_FALSE; return ResultFromScode(sc); }
STDAPI DllGetClassObject( REFCLSID rclsid, REFIID riid, LPVOID FAR *ppv) { if (!IsEqualCLSID(rclsid, CLSID_LocalUsers)) { return ResultFromScode(E_FAIL); }
if (!IsEqualIID(riid, IID_IUnknown) && !IsEqualIID(riid, IID_IClassFactory)) { return ResultFromScode(E_NOINTERFACE); }
static CLUClassFactory cf;
*ppv = (LPVOID)&cf;
cf.AddRef();
return NOERROR; }
}; /* extern "C" */
|