📄 urlfmain.cpp
字号:
// DllMain
// CClassFactory implementation
#include "stdhdr.h"
#include "Urlfmain.h"
#include "Urlffold.h"
#define INITGUID
#include <initguid.h>
DEFINE_GUID( CLSID_UrlfFolder, 0x04051965, 0x0fcc, 0x11ce, 0xbc, 0xb0,
0xb3, 0xfd, 0x0e, 0x25, 0x38, 0x41 );
/*---------------------------------------------------------------*/
// GLOBAL section
/*---------------------------------------------------------------*/
UINT g_cRefThisDll = 0;
HINSTANCE g_hInstance;
/*-------------------------------------------------------------------*/
// Procedure....: DllMain()
// Description..: Library main function
// Input........: HINSTANCE, DWORD, LPVOID
// Output.......: INT
/*-------------------------------------------------------------------*/
extern "C"
INT APIENTRY DllMain( HINSTANCE hInstance, DWORD dwReason,
LPVOID lpReserved)
{
if( dwReason==DLL_PROCESS_ATTACH )
{
g_hInstance = hInstance;
}
return TRUE;
}
// In-process server functions
/*-------------------------------------------------------------------*/
// Procedure....: DllGetClassObject()
// Description..: create a class factory object
// Input........: REFCLSID, REFIID, LPVOID
// Output.......: HRESULT (success/failure)
/*-------------------------------------------------------------------*/
STDAPI DllGetClassObject( REFCLSID rclsid, REFIID riid, LPVOID *ppv )
{
*ppv = NULL;
// make sure the class ID is CLSID_UrlfFolder
if( !IsEqualCLSID(rclsid, CLSID_UrlfFolder) )
return ResultFromScode ( CLASS_E_CLASSNOTAVAILABLE );
// instantiate a class factory object.
CClassFactory *pClassFactory = new CClassFactory();
if( pClassFactory == NULL )
return ResultFromScode( E_OUTOFMEMORY );
// get the interface pointer
HRESULT hr = pClassFactory->QueryInterface( riid, ppv );
pClassFactory->Release();
return hr;
}
/*-------------------------------------------------------------------*/
// Procedure....: DllCanUnloadNow()
// Description..: unload if reference count is 0
// Input........: VOID
// Output.......: HRESULT (yes/no)
/*-------------------------------------------------------------------*/
STDAPI DllCanUnloadNow( void )
{
return ResultFromScode( (g_cRefThisDll==0) ?S_OK :S_FALSE );
}
// CClassFactory member functions
/*-------------------------------------------------------------------*/
// Procedure....: CClassFactory()
// Description..: Constructor of the class
// Input........: VOID
// Output.......:
/*-------------------------------------------------------------------*/
CClassFactory::CClassFactory()
{
m_cRef = 1;
g_cRefThisDll++;
}
/*-------------------------------------------------------------------*/
// Procedure....: ~CClassFactory()
// Description..: Destructor of the class
// Input........: VOID
// Output.......:
/*-------------------------------------------------------------------*/
CClassFactory::~CClassFactory()
{
g_cRefThisDll--;
}
/*-------------------------------------------------------------------*/
// Procedure....: ::QueryInterface()
// Description..: return a pointer to the specified interface
// Input........: REFIID, LPVOID
// Output.......: HRESULT
/*-------------------------------------------------------------------*/
STDMETHODIMP CClassFactory::QueryInterface( REFIID riid, LPVOID FAR *ppv )
{
if( IsEqualIID(riid, IID_IUnknown) )
{
*ppv = (LPUNKNOWN) (LPCLASSFACTORY) this;
m_cRef++;
return NOERROR;
}
else
if( IsEqualIID(riid, IID_IClassFactory) )
{
*ppv = (LPCLASSFACTORY) this;
m_cRef++;
return NOERROR;
}
else
{
*ppv = NULL;
return ResultFromScode( E_NOINTERFACE );
}
}
/*-------------------------------------------------------------------*/
// Procedure....: ::AddRef()
// Description..: increase the reference count for the server
// Input........: VOID
// Output.......: ULONG
/*-------------------------------------------------------------------*/
STDMETHODIMP_(ULONG) CClassFactory::AddRef()
{
return ++m_cRef;
}
/*-------------------------------------------------------------------*/
// Procedure....: ::Release()
// Description..: decrease the reference count for the server
// Input........: VOID
// Output.......: ULONG
/*-------------------------------------------------------------------*/
STDMETHODIMP_(ULONG) CClassFactory::Release()
{
if( --m_cRef==0 )
delete this;
return m_cRef;
}
/*-------------------------------------------------------------------*/
// Procedure....: ::CreateInstance()
// Description..: create a shell extension object
// Input........: LPUNKNOWN, REFIID, LPVOID
// Output.......: HRESULT
/*-------------------------------------------------------------------*/
STDMETHODIMP CClassFactory::CreateInstance( LPUNKNOWN pUnkOuter, REFIID riid,
LPVOID FAR *ppvObj )
{
*ppvObj = NULL;
// don't support aggregation
if( pUnkOuter != NULL )
return ResultFromScode( CLASS_E_NOAGGREGATION );
// instantiate a shell extension object
CUrlfFolder *pUrlfFolder = new CUrlfFolder();
if( pUrlfFolder == NULL )
return ResultFromScode( E_OUTOFMEMORY );
// get the interface pointer
HRESULT hr = pUrlfFolder->QueryInterface( riid, ppvObj );
pUrlfFolder->Release();
return hr;
}
/*-------------------------------------------------------------------*/
// Procedure....: ::LockServer()
// Description..: inc/dec the lock count (not implemented)
// Input........: BOOL
// Output.......: HRESULT
/*-------------------------------------------------------------------*/
STDMETHODIMP CClassFactory::LockServer( BOOL fLock )
{
return ResultFromScode( E_NOTIMPL );
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -