203 lines
4.1 KiB
C++
203 lines
4.1 KiB
C++
/*******************************************************************************
|
|
*
|
|
* (C) COPYRIGHT MICROSOFT CORPORATION, 2000
|
|
*
|
|
* TITLE: MODULE.CPP
|
|
*
|
|
* VERSION: 1.0
|
|
*
|
|
* AUTHOR: ShaunIv
|
|
*
|
|
* DATE: 4/11/2000
|
|
*
|
|
* DESCRIPTION:
|
|
*
|
|
*******************************************************************************/
|
|
#include "precomp.h"
|
|
#pragma hdrstop
|
|
#include <initguid.h>
|
|
#include <itranspl.h>
|
|
#include <uicommon.h>
|
|
#include "postplug.h"
|
|
|
|
// DLL reference counters
|
|
static LONG g_nServerLocks = 0;
|
|
static LONG g_nComponents = 0;
|
|
|
|
// DLL instance
|
|
HINSTANCE g_hInstance;
|
|
|
|
//
|
|
// {81ED8E37-5938-46BF-B504-3539FB345419}
|
|
//
|
|
DEFINE_GUID(CLSID_HttpPostPlugin,0x81ED8E37,0x5938,0x46BF,0xB5,0x04,0x35,0x39,0xFB,0x34,0x54,0x19);
|
|
|
|
|
|
void DllAddRef()
|
|
{
|
|
InterlockedIncrement(&g_nComponents);
|
|
}
|
|
|
|
void DllRelease()
|
|
{
|
|
InterlockedDecrement(&g_nComponents);
|
|
}
|
|
|
|
|
|
|
|
class CHttpPostPluginClassFactory : public IClassFactory
|
|
{
|
|
private:
|
|
LONG m_cRef;
|
|
|
|
public:
|
|
// IUnknown
|
|
STDMETHODIMP QueryInterface( const IID &iid, void **ppv);
|
|
STDMETHODIMP_(ULONG) AddRef(void);
|
|
STDMETHODIMP_(ULONG) Release(void);
|
|
|
|
// IClassFactory
|
|
STDMETHODIMP CreateInstance( IUnknown *pUnknownOuter, const IID &iid, void **ppvObject );
|
|
STDMETHODIMP LockServer( BOOL bLock );
|
|
|
|
CHttpPostPluginClassFactory()
|
|
: m_cRef(1)
|
|
{
|
|
}
|
|
~CHttpPostPluginClassFactory(void)
|
|
{
|
|
}
|
|
};
|
|
|
|
|
|
|
|
STDMETHODIMP CHttpPostPluginClassFactory::QueryInterface( const IID &iid, void **ppvObject )
|
|
{
|
|
if ((iid==IID_IUnknown) || (iid==IID_IClassFactory))
|
|
{
|
|
*ppvObject = static_cast<LPVOID>(this);
|
|
}
|
|
else
|
|
{
|
|
*ppvObject = NULL;
|
|
return(E_NOINTERFACE);
|
|
}
|
|
reinterpret_cast<IUnknown*>(*ppvObject)->AddRef();
|
|
return(S_OK);
|
|
}
|
|
|
|
|
|
STDMETHODIMP_(ULONG) CHttpPostPluginClassFactory::AddRef(void)
|
|
{
|
|
return(InterlockedIncrement(&m_cRef));
|
|
}
|
|
|
|
|
|
STDMETHODIMP_(ULONG) CHttpPostPluginClassFactory::Release(void)
|
|
{
|
|
if (InterlockedDecrement(&m_cRef)==0)
|
|
{
|
|
delete this;
|
|
return 0;
|
|
}
|
|
return(m_cRef);
|
|
}
|
|
|
|
|
|
STDMETHODIMP CHttpPostPluginClassFactory::CreateInstance( IUnknown *pUnknownOuter, const IID &iid, void **ppvObject )
|
|
{
|
|
// No aggregation supported
|
|
if (pUnknownOuter)
|
|
{
|
|
return(CLASS_E_NOAGGREGATION);
|
|
}
|
|
CHttpPostPlugin *pHttpPostPlugin = new CHttpPostPlugin();
|
|
if (!pHttpPostPlugin)
|
|
{
|
|
return(E_OUTOFMEMORY);
|
|
}
|
|
|
|
HRESULT hr = pHttpPostPlugin->QueryInterface( iid, ppvObject );
|
|
|
|
pHttpPostPlugin->Release();
|
|
|
|
return (hr);
|
|
}
|
|
|
|
STDMETHODIMP CHttpPostPluginClassFactory::LockServer(BOOL bLock)
|
|
{
|
|
if (bLock)
|
|
{
|
|
InterlockedIncrement(&g_nServerLocks);
|
|
}
|
|
else
|
|
{
|
|
InterlockedDecrement(&g_nServerLocks);
|
|
}
|
|
return(S_OK);
|
|
}
|
|
|
|
|
|
extern "C" BOOL WINAPI DllMain( HINSTANCE hinst, DWORD dwReason, LPVOID lpReserved )
|
|
{
|
|
switch (dwReason)
|
|
{
|
|
case DLL_PROCESS_ATTACH:
|
|
g_hInstance = hinst;
|
|
DisableThreadLibraryCalls(hinst);
|
|
break;
|
|
}
|
|
return(TRUE);
|
|
}
|
|
|
|
|
|
extern "C" STDMETHODIMP DllRegisterServer(void)
|
|
{
|
|
return WiaUiUtil::InstallInfFromResource( g_hInstance, "RegDllCommon" );
|
|
}
|
|
|
|
extern "C" STDMETHODIMP DllUnregisterServer(void)
|
|
{
|
|
return WiaUiUtil::InstallInfFromResource( g_hInstance, "UnregDllCommon" );
|
|
}
|
|
|
|
extern "C" STDMETHODIMP DllCanUnloadNow(void)
|
|
{
|
|
if (g_nServerLocks == 0 && g_nComponents == 0)
|
|
{
|
|
return S_OK;
|
|
}
|
|
else
|
|
{
|
|
return S_FALSE;
|
|
}
|
|
}
|
|
|
|
extern "C" STDAPI DllGetClassObject( const CLSID &clsid, const IID &iid, void **ppvObject )
|
|
{
|
|
// Make sure we've got a valid ppvObject
|
|
if (!ppvObject)
|
|
{
|
|
return(E_INVALIDARG);
|
|
}
|
|
|
|
// Make sure this component is supplied by this server
|
|
if (clsid != CLSID_HttpPostPlugin)
|
|
{
|
|
return (CLASS_E_CLASSNOTAVAILABLE);
|
|
}
|
|
|
|
// Create class factory
|
|
CHttpPostPluginClassFactory *pHttpPostPluginClassFactory = new CHttpPostPluginClassFactory;
|
|
if (!pHttpPostPluginClassFactory)
|
|
{
|
|
return (E_OUTOFMEMORY);
|
|
}
|
|
|
|
HRESULT hr = pHttpPostPluginClassFactory->QueryInterface( iid, ppvObject );
|
|
pHttpPostPluginClassFactory->Release();
|
|
|
|
return (hr);
|
|
}
|
|
|