256 lines
4.6 KiB
C++
256 lines
4.6 KiB
C++
//
|
|
// Copyright (c) 2001 Microsoft Corporation
|
|
//
|
|
//
|
|
|
|
#include "appshcut.h"
|
|
|
|
// {b95ec110-5c3e-433c-b969-701c10521ef2}
|
|
static const GUID CLSID_AppShortcut =
|
|
{ 0xb95ec110, 0x5c3e, 0x433c, { 0xb9, 0x69, 0x70, 0x1c, 0x10, 0x52, 0x1e, 0xf2 } };
|
|
|
|
extern ULONG DllAddRef(void);
|
|
extern ULONG DllRelease(void);
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// ----------------------------------------------------------------------------
|
|
|
|
CAppShortcutClassFactory::CAppShortcutClassFactory()
|
|
{
|
|
_cRef = 1;
|
|
}
|
|
|
|
// ----------------------------------------------------------------------------
|
|
|
|
HRESULT
|
|
CAppShortcutClassFactory::QueryInterface(REFIID iid, void **ppv)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
*ppv = NULL;
|
|
|
|
if (iid == IID_IUnknown || iid == IID_IClassFactory)
|
|
{
|
|
*ppv = (IClassFactory *)this;
|
|
}
|
|
else
|
|
{
|
|
hr = E_NOINTERFACE;
|
|
goto exit;
|
|
}
|
|
|
|
((IUnknown *)*ppv)->AddRef();
|
|
|
|
exit:
|
|
return hr;
|
|
}
|
|
|
|
// ----------------------------------------------------------------------------
|
|
|
|
ULONG
|
|
CAppShortcutClassFactory::AddRef()
|
|
{
|
|
return (ULONG) InterlockedIncrement(&_cRef);
|
|
}
|
|
|
|
ULONG
|
|
CAppShortcutClassFactory::Release()
|
|
{
|
|
LONG ulCount = InterlockedDecrement(&_cRef);
|
|
|
|
if (ulCount <= 0)
|
|
{
|
|
delete this;
|
|
}
|
|
|
|
return (ULONG) ulCount;
|
|
}
|
|
|
|
HRESULT
|
|
CAppShortcutClassFactory::LockServer(BOOL lock)
|
|
{
|
|
return (lock ?
|
|
DllAddRef() :
|
|
DllRelease());
|
|
}
|
|
|
|
// ----------------------------------------------------------------------------
|
|
|
|
HRESULT
|
|
CAppShortcutClassFactory::CreateInstance(IUnknown* pUnkOuter, REFIID iid, void** ppv)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
CAppShortcut *pAppShortcut = NULL;
|
|
|
|
*ppv = NULL;
|
|
|
|
if (pUnkOuter && iid != IID_IUnknown)
|
|
{
|
|
hr = CLASS_E_NOAGGREGATION;
|
|
goto exit;
|
|
}
|
|
|
|
pAppShortcut = new CAppShortcut();
|
|
if (pAppShortcut == NULL)
|
|
{
|
|
hr = E_OUTOFMEMORY;
|
|
goto exit;
|
|
}
|
|
|
|
if (iid == IID_IUnknown)
|
|
{
|
|
*ppv = (IShellLink *)pAppShortcut;
|
|
pAppShortcut->AddRef();
|
|
}
|
|
else
|
|
{
|
|
hr = pAppShortcut->QueryInterface(iid, ppv);
|
|
if (FAILED(hr))
|
|
goto exit;
|
|
}
|
|
|
|
exit:
|
|
if (pAppShortcut)
|
|
pAppShortcut->Release();
|
|
|
|
return hr;
|
|
}
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// ----------------------------------------------------------------------------
|
|
|
|
CAppShortcut::CAppShortcut()
|
|
: RefCount()
|
|
{
|
|
// Don't validate this until after construction.
|
|
|
|
m_dwFlags = APPSHCUT_FL_NOTDIRTY;
|
|
m_pwzShortcutFile = NULL;
|
|
m_pwzPath = NULL;
|
|
m_pwzDesc = NULL;
|
|
m_pwzIconFile = NULL;
|
|
m_niIcon = 0;
|
|
m_pwzWorkingDirectory = NULL;
|
|
m_nShowCmd = DEFAULTSHOWCMD;
|
|
m_wHotkey = 0;
|
|
|
|
m_pappRefInfo = NULL;
|
|
|
|
return;
|
|
}
|
|
|
|
CAppShortcut::~CAppShortcut(void)
|
|
{
|
|
if (m_pwzShortcutFile)
|
|
{
|
|
delete m_pwzShortcutFile;
|
|
m_pwzShortcutFile = NULL;
|
|
}
|
|
|
|
if (m_pwzPath)
|
|
{
|
|
delete m_pwzPath;
|
|
m_pwzPath = NULL;
|
|
}
|
|
|
|
if (m_pwzDesc)
|
|
{
|
|
delete m_pwzDesc;
|
|
m_pwzDesc = NULL;
|
|
}
|
|
|
|
if (m_pwzIconFile)
|
|
{
|
|
delete m_pwzIconFile;
|
|
m_pwzIconFile = NULL;
|
|
m_niIcon = 0;
|
|
}
|
|
|
|
if (m_pwzWorkingDirectory)
|
|
{
|
|
delete m_pwzWorkingDirectory;
|
|
m_pwzWorkingDirectory = NULL;
|
|
}
|
|
|
|
if (m_pappRefInfo)
|
|
{
|
|
delete m_pappRefInfo;
|
|
m_pappRefInfo = NULL;
|
|
}
|
|
|
|
RefCount::~RefCount();
|
|
|
|
return;
|
|
}
|
|
|
|
|
|
ULONG STDMETHODCALLTYPE CAppShortcut::AddRef(void)
|
|
{
|
|
ULONG ulcRef;
|
|
|
|
ulcRef = RefCount::AddRef();
|
|
|
|
return(ulcRef);
|
|
}
|
|
|
|
|
|
ULONG STDMETHODCALLTYPE CAppShortcut::Release(void)
|
|
{
|
|
ULONG ulcRef;
|
|
|
|
ulcRef = RefCount::Release();
|
|
|
|
return(ulcRef);
|
|
}
|
|
|
|
|
|
HRESULT STDMETHODCALLTYPE CAppShortcut::QueryInterface(REFIID riid,
|
|
PVOID *ppvObject)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
if (riid == IID_IExtractIcon)
|
|
{
|
|
*ppvObject = (IExtractIcon*)this;
|
|
}
|
|
else if (riid == IID_IPersist)
|
|
{
|
|
*ppvObject = (IPersist*)(IPersistFile*)this;
|
|
}
|
|
else if (riid == IID_IPersistFile)
|
|
{
|
|
*ppvObject = (IPersistFile*)this;
|
|
}
|
|
else if (riid == IID_IShellExtInit)
|
|
{
|
|
*ppvObject = (IShellExtInit*)this;
|
|
}
|
|
else if (riid == IID_IShellLink)
|
|
{
|
|
*ppvObject = (IShellLink*)this;
|
|
}
|
|
else if (riid == IID_IShellPropSheetExt)
|
|
{
|
|
*ppvObject = (IShellPropSheetExt*)this;
|
|
}
|
|
else if (riid == IID_IQueryInfo)
|
|
{
|
|
*ppvObject = (IQueryInfo*)this;
|
|
}
|
|
else if (riid == IID_IUnknown)
|
|
{
|
|
*ppvObject = (IUnknown*)(IShellLink*)this;
|
|
}
|
|
else
|
|
{
|
|
*ppvObject = NULL;
|
|
hr = E_NOINTERFACE;
|
|
}
|
|
|
|
if (hr == S_OK)
|
|
AddRef();
|
|
|
|
return(hr);
|
|
}
|
|
|