[NETSHELL] Use smart pointers and IID_PPV_ARG

This commit is contained in:
Giannis Adamopoulos 2018-11-12 16:46:45 +02:00
parent c73d8c64bb
commit 769b102e5f
7 changed files with 160 additions and 243 deletions

View file

@ -124,45 +124,36 @@ HRESULT
CEnumIDList::Initialize() CEnumIDList::Initialize()
{ {
HRESULT hr; HRESULT hr;
INetConnectionManager *pNetConMan; CComPtr<INetConnectionManager> pNetConMan;
IEnumNetConnection *pEnumCon; CComPtr<IEnumNetConnection> pEnumCon;
INetConnection *INetCon;
ULONG Count; ULONG Count;
PITEMID_CHILD pidl; PITEMID_CHILD pidl;
/* get an instance to of IConnectionManager */ /* get an instance to of IConnectionManager */
hr = CNetConnectionManager_CreateInstance(IID_INetConnectionManager, (LPVOID*)&pNetConMan); hr = CNetConnectionManager_CreateInstance(IID_PPV_ARG(INetConnectionManager, &pNetConMan));
if (FAILED(hr)) if (FAILED_UNEXPECTEDLY(hr))
return S_OK; return S_OK;
hr = pNetConMan->EnumConnections(NCME_DEFAULT, &pEnumCon); hr = pNetConMan->EnumConnections(NCME_DEFAULT, &pEnumCon);
if (FAILED(hr)) if (FAILED_UNEXPECTEDLY(hr))
{
pNetConMan->Release();
return S_OK; return S_OK;
while (TRUE)
{
CComPtr<INetConnection> INetCon;
hr = pEnumCon->Next(1, &INetCon, &Count);
if (hr != S_OK)
break;
pidl = ILCreateNetConnectItem(INetCon);
if (pidl)
{
AddToEnumList(pidl);
}
} }
do return S_OK;
{
hr = pEnumCon->Next(1, &INetCon, &Count);
if (hr == S_OK)
{
pidl = ILCreateNetConnectItem(INetCon);
if (pidl)
{
AddToEnumList(pidl);
}
}
else
{
break;
}
} while (TRUE);
pEnumCon->Release();
pNetConMan->Release();
return S_OK;
} }
HRESULT HRESULT

View file

@ -8,9 +8,6 @@
#include "precomp.h" #include "precomp.h"
CNetConnectionPropertyUi::CNetConnectionPropertyUi() : CNetConnectionPropertyUi::CNetConnectionPropertyUi() :
m_pCon(NULL),
m_NCfgLock(NULL),
m_pNCfg(NULL),
m_pProperties(NULL) m_pProperties(NULL)
{ {
} }
@ -18,18 +15,10 @@ CNetConnectionPropertyUi::CNetConnectionPropertyUi() :
CNetConnectionPropertyUi::~CNetConnectionPropertyUi() CNetConnectionPropertyUi::~CNetConnectionPropertyUi()
{ {
if (m_pNCfg) if (m_pNCfg)
{
m_pNCfg->Uninitialize(); m_pNCfg->Uninitialize();
m_pNCfg->Release();
}
if (m_NCfgLock)
{
m_NCfgLock->Release();
}
if (m_pProperties) if (m_pProperties)
{
NcFreeNetconProperties(m_pProperties); NcFreeNetconProperties(m_pProperties);
}
} }
VOID VOID
@ -51,32 +40,31 @@ CNetConnectionPropertyUi::GetINetCfgComponent(INetCfg *pNCfg, INetCfgComponent *
{ {
LPWSTR pName; LPWSTR pName;
HRESULT hr; HRESULT hr;
INetCfgComponent * pNCg;
ULONG Fetched; ULONG Fetched;
IEnumNetCfgComponent * pEnumCfg; CComPtr<IEnumNetCfgComponent> pEnumCfg;
hr = pNCfg->EnumComponents(&GUID_DEVCLASS_NET, &pEnumCfg); hr = pNCfg->EnumComponents(&GUID_DEVCLASS_NET, &pEnumCfg);
if (FAILED(hr)) if (FAILED_UNEXPECTEDLY(hr))
{
return FALSE; return FALSE;
}
while (pEnumCfg->Next(1, &pNCg, &Fetched) == S_OK) while (TRUE)
{ {
CComPtr<INetCfgComponent> pNCg;
hr = pEnumCfg->Next(1, &pNCg, &Fetched);
if (hr != S_OK)
break;
hr = pNCg->GetDisplayName(&pName); hr = pNCg->GetDisplayName(&pName);
if (SUCCEEDED(hr)) if (SUCCEEDED(hr))
{ {
if (!_wcsicmp(pName, m_pProperties->pszwDeviceName)) if (!_wcsicmp(pName, m_pProperties->pszwDeviceName))
{ {
*pOut = pNCg; *pOut = pNCg.Detach();
pEnumCfg->Release();
return TRUE; return TRUE;
} }
CoTaskMemFree(pName); CoTaskMemFree(pName);
} }
pNCg->Release();
} }
pEnumCfg->Release();
return FALSE; return FALSE;
} }
@ -84,9 +72,7 @@ VOID
CNetConnectionPropertyUi::EnumComponents(HWND hDlgCtrl, INetCfg *pNCfg, const GUID *CompGuid, UINT Type) CNetConnectionPropertyUi::EnumComponents(HWND hDlgCtrl, INetCfg *pNCfg, const GUID *CompGuid, UINT Type)
{ {
HRESULT hr; HRESULT hr;
IEnumNetCfgComponent * pENetCfg; CComPtr<IEnumNetCfgComponent> pENetCfg;
INetCfgComponent *pNCfgComp, *pAdapterCfgComp;
INetCfgComponentBindings * pCompBind;
ULONG Num; ULONG Num;
DWORD dwCharacteristics; DWORD dwCharacteristics;
LPOLESTR pDisplayName, pHelpText; LPOLESTR pDisplayName, pHelpText;
@ -94,25 +80,29 @@ CNetConnectionPropertyUi::EnumComponents(HWND hDlgCtrl, INetCfg *pNCfg, const GU
BOOL bChecked; BOOL bChecked;
hr = pNCfg->EnumComponents(CompGuid, &pENetCfg); hr = pNCfg->EnumComponents(CompGuid, &pENetCfg);
if (FAILED(hr)) if (FAILED_UNEXPECTEDLY(hr))
{
pNCfg->Release();
return; return;
}
while (pENetCfg->Next(1, &pNCfgComp, &Num) == S_OK) while (TRUE)
{ {
CComPtr<INetCfgComponent> pNCfgComp;
CComPtr<INetCfgComponentBindings> pCompBind;
CComPtr<INetCfgComponent> pAdapterCfgComp;
hr = pENetCfg->Next(1, &pNCfgComp, &Num);
if (hr != S_OK)
break;
hr = pNCfgComp->GetCharacteristics(&dwCharacteristics); hr = pNCfgComp->GetCharacteristics(&dwCharacteristics);
if (SUCCEEDED(hr) && (dwCharacteristics & NCF_HIDDEN)) if (SUCCEEDED(hr) && (dwCharacteristics & NCF_HIDDEN))
{
pNCfgComp->Release();
continue; continue;
}
pDisplayName = NULL; pDisplayName = NULL;
pHelpText = NULL; pHelpText = NULL;
hr = pNCfgComp->GetDisplayName(&pDisplayName); hr = pNCfgComp->GetDisplayName(&pDisplayName);
hr = pNCfgComp->GetHelpText(&pHelpText); hr = pNCfgComp->GetHelpText(&pHelpText);
bChecked = TRUE; //ReactOS hack bChecked = TRUE; //ReactOS hack
hr = pNCfgComp->QueryInterface(IID_INetCfgComponentBindings, (LPVOID*)&pCompBind); hr = pNCfgComp->QueryInterface(IID_PPV_ARG(INetCfgComponentBindings, &pCompBind));
if (SUCCEEDED(hr)) if (SUCCEEDED(hr))
{ {
if (GetINetCfgComponent(pNCfg, &pAdapterCfgComp)) if (GetINetCfgComponent(pNCfg, &pAdapterCfgComp))
@ -122,8 +112,6 @@ CNetConnectionPropertyUi::EnumComponents(HWND hDlgCtrl, INetCfg *pNCfg, const GU
bChecked = TRUE; bChecked = TRUE;
else else
bChecked = FALSE; bChecked = FALSE;
pAdapterCfgComp->Release();
pCompBind->Release();
} }
} }
@ -134,21 +122,20 @@ CNetConnectionPropertyUi::EnumComponents(HWND hDlgCtrl, INetCfg *pNCfg, const GU
pItem->dwCharacteristics = dwCharacteristics; pItem->dwCharacteristics = dwCharacteristics;
pItem->szHelp = pHelpText; pItem->szHelp = pHelpText;
pItem->Type = (NET_TYPE)Type; pItem->Type = (NET_TYPE)Type;
pItem->pNCfgComp = pNCfgComp; pItem->pNCfgComp = pNCfgComp.Detach();
pItem->NumPropDialogOpen = 0; pItem->NumPropDialogOpen = 0;
AddItemToListView(hDlgCtrl, pItem, pDisplayName, bChecked); AddItemToListView(hDlgCtrl, pItem, pDisplayName, bChecked);
CoTaskMemFree(pDisplayName); CoTaskMemFree(pDisplayName);
} }
pENetCfg->Release();
} }
VOID VOID
CNetConnectionPropertyUi::InitializeLANPropertiesUIDlg(HWND hwndDlg) CNetConnectionPropertyUi::InitializeLANPropertiesUIDlg(HWND hwndDlg)
{ {
HRESULT hr; HRESULT hr;
INetCfg *pNCfg; CComPtr<INetCfg> pNCfg;
INetCfgLock *pNCfgLock; CComPtr<INetCfgLock> pNCfgLock;
HWND hDlgCtrl = GetDlgItem(hwndDlg, IDC_COMPONENTSLIST); HWND hDlgCtrl = GetDlgItem(hwndDlg, IDC_COMPONENTSLIST);
LVCOLUMNW lc; LVCOLUMNW lc;
RECT rc; RECT rc;
@ -182,11 +169,11 @@ CNetConnectionPropertyUi::InitializeLANPropertiesUIDlg(HWND hwndDlg)
dwStyle = dwStyle | LVS_EX_FULLROWSELECT | LVS_EX_CHECKBOXES; dwStyle = dwStyle | LVS_EX_FULLROWSELECT | LVS_EX_CHECKBOXES;
SendMessage(hDlgCtrl, LVM_SETEXTENDEDLISTVIEWSTYLE, 0, dwStyle); SendMessage(hDlgCtrl, LVM_SETEXTENDEDLISTVIEWSTYLE, 0, dwStyle);
hr = CoCreateInstance(CLSID_CNetCfg, NULL, CLSCTX_INPROC_SERVER, IID_INetCfg, (LPVOID*)&pNCfg); hr = CoCreateInstance(CLSID_CNetCfg, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARG(INetCfg, &pNCfg));
if (FAILED(hr)) if (FAILED(hr))
return; return;
hr = pNCfg->QueryInterface(IID_INetCfgLock, (LPVOID*)&pNCfgLock); hr = pNCfg->QueryInterface(IID_PPV_ARG(INetCfgLock, &pNCfgLock));
hr = pNCfgLock->AcquireWriteLock(100, L"", &pDisplayName); hr = pNCfgLock->AcquireWriteLock(100, L"", &pDisplayName);
if (hr == S_FALSE) if (hr == S_FALSE)
{ {
@ -194,18 +181,16 @@ CNetConnectionPropertyUi::InitializeLANPropertiesUIDlg(HWND hwndDlg)
return; return;
} }
m_NCfgLock = pNCfgLock;
hr = pNCfg->Initialize(NULL); hr = pNCfg->Initialize(NULL);
if (FAILED(hr)) if (FAILED_UNEXPECTEDLY(hr))
{
pNCfg->Release();
return; return;
}
m_pNCfg = pNCfg;
m_NCfgLock = pNCfgLock;
EnumComponents(hDlgCtrl, pNCfg, &GUID_DEVCLASS_NETCLIENT, NET_TYPE_CLIENT); EnumComponents(hDlgCtrl, pNCfg, &GUID_DEVCLASS_NETCLIENT, NET_TYPE_CLIENT);
EnumComponents(hDlgCtrl, pNCfg, &GUID_DEVCLASS_NETSERVICE, NET_TYPE_SERVICE); EnumComponents(hDlgCtrl, pNCfg, &GUID_DEVCLASS_NETSERVICE, NET_TYPE_SERVICE);
EnumComponents(hDlgCtrl, pNCfg, &GUID_DEVCLASS_NETTRANS, NET_TYPE_PROTOCOL); EnumComponents(hDlgCtrl, pNCfg, &GUID_DEVCLASS_NETTRANS, NET_TYPE_PROTOCOL);
m_pNCfg = pNCfg;
ZeroMemory(&li, sizeof(li)); ZeroMemory(&li, sizeof(li));
li.mask = LVIF_STATE; li.mask = LVIF_STATE;
@ -459,7 +444,7 @@ CNetConnectionPropertyUi::AddPages(
return E_FAIL; return E_FAIL;
hr = m_pCon->GetProperties(&m_pProperties); hr = m_pCon->GetProperties(&m_pProperties);
if (FAILED(hr)) if (FAILED_UNEXPECTEDLY(hr))
return hr; return hr;
hProp = InitializePropertySheetPage(MAKEINTRESOURCEW(IDD_NETPROPERTIES), LANPropertiesUIDlg, reinterpret_cast<LPARAM>(this), NULL); hProp = InitializePropertySheetPage(MAKEINTRESOURCEW(IDD_NETPROPERTIES), LANPropertiesUIDlg, reinterpret_cast<LPARAM>(this), NULL);
@ -499,15 +484,10 @@ HRESULT
WINAPI WINAPI
CNetConnectionPropertyUi::SetConnection(INetConnection* pCon) CNetConnectionPropertyUi::SetConnection(INetConnection* pCon)
{ {
if (m_pCon)
m_pCon->Release();
if (!pCon) if (!pCon)
return E_POINTER; return E_POINTER;
m_pCon = pCon; m_pCon = pCon;
pCon->AddRef();
return S_OK; return S_OK;
} }
@ -520,7 +500,6 @@ CNetConnectionPropertyUi::Connect(
if (!m_pCon) if (!m_pCon)
return E_POINTER; //FIXME return E_POINTER; //FIXME
if (dwFlags & NCUC_NO_UI) if (dwFlags & NCUC_NO_UI)
return m_pCon->Connect(); return m_pCon->Connect();

View file

@ -50,9 +50,9 @@ class CNetConnectionPropertyUi:
BOOL GetDeviceInstanceID(OUT LPOLESTR *DeviceInstanceID); BOOL GetDeviceInstanceID(OUT LPOLESTR *DeviceInstanceID);
static INT_PTR CALLBACK LANPropertiesUIDlg(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); static INT_PTR CALLBACK LANPropertiesUIDlg(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
INetConnection * m_pCon; CComPtr<INetConnection> m_pCon;
INetCfgLock *m_NCfgLock; CComPtr<INetCfgLock> m_NCfgLock;
INetCfg * m_pNCfg; CComPtr<INetCfg> m_pNCfg;
NETCON_PROPERTIES * m_pProperties; NETCON_PROPERTIES * m_pProperties;
public: public:

View file

@ -903,9 +903,9 @@ CLanStatus::InitializeNetTaskbarNotifications()
{ {
NOTIFYICONDATAW nid; NOTIFYICONDATAW nid;
HWND hwndDlg; HWND hwndDlg;
INetConnectionManager *pNetConMan; CComPtr<INetConnectionManager> pNetConMan;
IEnumNetConnection *pEnumCon; CComPtr<IEnumNetConnection> pEnumCon;
INetConnection *pNetCon; CComPtr<INetConnection> pNetCon;
NETCON_PROPERTIES* pProps; NETCON_PROPERTIES* pProps;
HRESULT hr; HRESULT hr;
ULONG Count; ULONG Count;
@ -942,108 +942,100 @@ CLanStatus::InitializeNetTaskbarNotifications()
return S_OK; return S_OK;
} }
/* get an instance to of IConnectionManager */ /* get an instance to of IConnectionManager */
hr = CNetConnectionManager_CreateInstance(IID_PPV_ARG(INetConnectionManager, &pNetConMan));
//hr = CoCreateInstance(&CLSID_ConnectionManager, NULL, CLSCTX_INPROC_SERVER, &IID_INetConnectionManager, (LPVOID*)&pNetConMan); if (FAILED_UNEXPECTEDLY(hr))
hr = CNetConnectionManager_CreateInstance(IID_INetConnectionManager, (LPVOID*)&pNetConMan);
if (FAILED(hr))
{
ERR("CNetConnectionManager_CreateInstance failed\n");
return hr; return hr;
}
hr = pNetConMan->EnumConnections(NCME_DEFAULT, &pEnumCon); hr = pNetConMan->EnumConnections(NCME_DEFAULT, &pEnumCon);
if (FAILED(hr)) if (FAILED_UNEXPECTEDLY(hr))
{
ERR("EnumConnections failed\n");
pNetConMan->Release();
return hr; return hr;
}
Index = 1; Index = 1;
do while (TRUE)
{ {
hr = pEnumCon->Next(1, &pNetCon, &Count); hr = pEnumCon->Next(1, &pNetCon, &Count);
if (hr == S_OK) if (hr != S_OK)
break;
TRACE("new connection\n");
pItem = static_cast<NOTIFICATION_ITEM*>(CoTaskMemAlloc(sizeof(NOTIFICATION_ITEM)));
if (!pItem)
break;
pContext = static_cast<LANSTATUSUI_CONTEXT*>(CoTaskMemAlloc(sizeof(LANSTATUSUI_CONTEXT)));
if (!pContext)
{ {
TRACE("new connection\n"); CoTaskMemFree(pItem);
pItem = static_cast<NOTIFICATION_ITEM*>(CoTaskMemAlloc(sizeof(NOTIFICATION_ITEM))); break;
if (!pItem)
break;
pContext = static_cast<LANSTATUSUI_CONTEXT*>(CoTaskMemAlloc(sizeof(LANSTATUSUI_CONTEXT)));
if (!pContext)
{
CoTaskMemFree(pItem);
break;
}
ZeroMemory(pContext, sizeof(LANSTATUSUI_CONTEXT));
pContext->uID = Index;
pContext->pNet = pNetCon;
pItem->uID = Index;
pItem->pNext = NULL;
pItem->pNet = pNetCon;
hwndDlg = CreateDialogParamW(netshell_hInstance, MAKEINTRESOURCEW(IDD_STATUS), NULL, LANStatusDlg, (LPARAM)pContext);
if (hwndDlg)
{
ZeroMemory(&nid, sizeof(nid));
nid.cbSize = sizeof(nid);
nid.uID = Index++;
nid.uFlags = NIF_MESSAGE;
nid.uVersion = NOTIFYICON_VERSION;
nid.uCallbackMessage = WM_SHOWSTATUSDLG;
nid.hWnd = hwndDlg;
hr = pNetCon->GetProperties(&pProps);
if (SUCCEEDED(hr))
{
CopyMemory(&pItem->guidItem, &pProps->guidId, sizeof(GUID));
if (!(pProps->dwCharacter & NCCF_SHOW_ICON))
{
nid.dwState = NIS_HIDDEN;
nid.dwStateMask = NIS_HIDDEN;
nid.uFlags |= NIF_STATE;
}
if (pProps->Status == NCS_MEDIA_DISCONNECTED || pProps->Status == NCS_DISCONNECTED || pProps->Status == NCS_HARDWARE_DISABLED)
nid.hIcon = LoadIcon(netshell_hInstance, MAKEINTRESOURCE(IDI_NET_OFF));
else if (pProps->Status == NCS_CONNECTED)
nid.hIcon = LoadIcon(netshell_hInstance, MAKEINTRESOURCE(IDI_NET_IDLE));
if (nid.hIcon)
nid.uFlags |= NIF_ICON;
wcscpy(nid.szTip, pProps->pszwName);
nid.uFlags |= NIF_TIP;
}
pContext->hwndStatusDlg = hwndDlg;
pItem->hwndDlg = hwndDlg;
if (Shell_NotifyIconW(NIM_ADD, &nid))
{
if (pLast)
pLast->pNext = pItem;
else
m_pHead = pItem;
pLast = pItem;
Index++;
}
else
{
ERR("Shell_NotifyIconW failed\n");
CoTaskMemFree(pItem);
}
if (nid.uFlags & NIF_ICON)
DestroyIcon(nid.hIcon);
} else
ERR("CreateDialogParamW failed\n");
} }
} while (hr == S_OK);
ZeroMemory(pContext, sizeof(LANSTATUSUI_CONTEXT));
pContext->uID = Index;
pContext->pNet = pNetCon;
pItem->uID = Index;
pItem->pNext = NULL;
pItem->pNet = pNetCon;
pNetCon->AddRef();
hwndDlg = CreateDialogParamW(netshell_hInstance, MAKEINTRESOURCEW(IDD_STATUS), NULL, LANStatusDlg, (LPARAM)pContext);
if (!hwndDlg)
{
ERR("CreateDialogParamW failed\n");
continue;
}
ZeroMemory(&nid, sizeof(nid));
nid.cbSize = sizeof(nid);
nid.uID = Index++;
nid.uFlags = NIF_MESSAGE;
nid.uVersion = NOTIFYICON_VERSION;
nid.uCallbackMessage = WM_SHOWSTATUSDLG;
nid.hWnd = hwndDlg;
hr = pNetCon->GetProperties(&pProps);
if (SUCCEEDED(hr))
{
CopyMemory(&pItem->guidItem, &pProps->guidId, sizeof(GUID));
if (!(pProps->dwCharacter & NCCF_SHOW_ICON))
{
nid.dwState = NIS_HIDDEN;
nid.dwStateMask = NIS_HIDDEN;
nid.uFlags |= NIF_STATE;
}
if (pProps->Status == NCS_MEDIA_DISCONNECTED || pProps->Status == NCS_DISCONNECTED || pProps->Status == NCS_HARDWARE_DISABLED)
nid.hIcon = LoadIcon(netshell_hInstance, MAKEINTRESOURCE(IDI_NET_OFF));
else if (pProps->Status == NCS_CONNECTED)
nid.hIcon = LoadIcon(netshell_hInstance, MAKEINTRESOURCE(IDI_NET_IDLE));
if (nid.hIcon)
nid.uFlags |= NIF_ICON;
wcscpy(nid.szTip, pProps->pszwName);
nid.uFlags |= NIF_TIP;
}
pContext->hwndStatusDlg = hwndDlg;
pItem->hwndDlg = hwndDlg;
if (Shell_NotifyIconW(NIM_ADD, &nid))
{
if (pLast)
pLast->pNext = pItem;
else
m_pHead = pItem;
pLast = pItem;
Index++;
}
else
{
ERR("Shell_NotifyIconW failed\n");
CoTaskMemFree(pItem);
}
if (nid.uFlags & NIF_ICON)
DestroyIcon(nid.hIcon);
}
m_lpNetMan = pNetConMan; m_lpNetMan = pNetConMan;
pEnumCon->Release();
return S_OK; return S_OK;
} }

View file

@ -47,7 +47,7 @@ class CLanStatus:
HRESULT InitializeNetTaskbarNotifications(); HRESULT InitializeNetTaskbarNotifications();
HRESULT ShowStatusDialogByCLSID(const GUID *pguidCmdGroup); HRESULT ShowStatusDialogByCLSID(const GUID *pguidCmdGroup);
INetConnectionManager *m_lpNetMan; CComPtr<INetConnectionManager> m_lpNetMan;
NOTIFICATION_ITEM *m_pHead; NOTIFICATION_ITEM *m_pHead;
public: public:

View file

@ -57,18 +57,13 @@ CNetworkConnections::CNetworkConnections() :
m_pidlRoot(_ILCreateNetConnect()) m_pidlRoot(_ILCreateNetConnect())
{ {
HRESULT hr; HRESULT hr;
hr = CoCreateInstance(CLSID_ConnectionTray, NULL, CLSCTX_INPROC_SERVER, IID_IOleCommandTarget, reinterpret_cast<PVOID*>(&m_lpOleCmd)); hr = CoCreateInstance(CLSID_ConnectionTray, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARG(IOleCommandTarget, &m_lpOleCmd));
if (FAILED(hr)) if (FAILED_UNEXPECTEDLY(hr))
{
ERR("CoCreateInstance failed with %lx\n", hr);
m_lpOleCmd = NULL; m_lpOleCmd = NULL;
}
} }
CNetworkConnections::~CNetworkConnections() CNetworkConnections::~CNetworkConnections()
{ {
if (m_lpOleCmd)
m_lpOleCmd->Release();
SHFree(m_pidlRoot); SHFree(m_pidlRoot);
} }
@ -132,7 +127,6 @@ HRESULT WINAPI CNetworkConnections::CompareIDs(
HRESULT WINAPI CNetworkConnections::CreateViewObject( HRESULT WINAPI CNetworkConnections::CreateViewObject(
HWND hwndOwner, REFIID riid, LPVOID * ppvOut) HWND hwndOwner, REFIID riid, LPVOID * ppvOut)
{ {
CSFV cvf;
HRESULT hr = E_NOINTERFACE; HRESULT hr = E_NOINTERFACE;
if (!ppvOut) if (!ppvOut)
@ -142,17 +136,13 @@ HRESULT WINAPI CNetworkConnections::CreateViewObject(
if (IsEqualIID(riid, IID_IShellView)) if (IsEqualIID(riid, IID_IShellView))
{ {
ZeroMemory(&cvf, sizeof(cvf)); CSFV cvf = {sizeof(cvf), this};
cvf.cbSize = sizeof(cvf); CComPtr<IShellView> pShellView;
cvf.pshf = static_cast<IShellFolder*>(this);
IShellView* pShellView;
hr = SHCreateShellFolderViewEx(&cvf, &pShellView); hr = SHCreateShellFolderViewEx(&cvf, &pShellView);
if (SUCCEEDED(hr)) if (FAILED_UNEXPECTEDLY(hr))
{ return hr;
hr = pShellView->QueryInterface(riid, ppvOut);
pShellView->Release(); return pShellView->QueryInterface(riid, ppvOut);
}
} }
return hr; return hr;
@ -488,24 +478,18 @@ HRESULT WINAPI CNetworkConnections::MapColumnToSCID(UINT column, SHCOLUMNID *psc
*/ */
CNetConUiObject::CNetConUiObject() CNetConUiObject::CNetConUiObject()
: m_pidl(NULL), : m_pidl(NULL)
m_pUnknown(NULL),
m_lpOleCmd(NULL)
{ {
} }
CNetConUiObject::~CNetConUiObject() CNetConUiObject::~CNetConUiObject()
{ {
if (m_lpOleCmd)
m_lpOleCmd->Release();
} }
HRESULT WINAPI CNetConUiObject::Initialize(PCUITEMID_CHILD pidl, IOleCommandTarget *lpOleCmd) HRESULT WINAPI CNetConUiObject::Initialize(PCUITEMID_CHILD pidl, IOleCommandTarget *lpOleCmd)
{ {
m_pidl = pidl; m_pidl = pidl;
m_lpOleCmd = lpOleCmd; m_lpOleCmd = lpOleCmd;
if (m_lpOleCmd)
m_lpOleCmd->AddRef();
return S_OK; return S_OK;
} }
@ -657,7 +641,7 @@ ShowNetConnectionProperties(
CLSID ClassID; CLSID ClassID;
PROPSHEETHEADERW pinfo; PROPSHEETHEADERW pinfo;
HPROPSHEETPAGE hppages[MAX_PROPERTY_SHEET_PAGE]; HPROPSHEETPAGE hppages[MAX_PROPERTY_SHEET_PAGE];
INetConnectionPropertyUi * pNCP; CComPtr<INetConnectionPropertyUi> pNCP;
NETCON_PROPERTIES * pProperties; NETCON_PROPERTIES * pProperties;
if (pNetConnect->GetProperties(&pProperties) != S_OK) if (pNetConnect->GetProperties(&pProperties) != S_OK)
@ -695,7 +679,6 @@ ShowNetConnectionProperties(
hr = E_FAIL; hr = E_FAIL;
} }
} }
pNCP->Release();
NcFreeNetconProperties(pProperties); NcFreeNetconProperties(pProperties);
return hr; return hr;
} }
@ -737,14 +720,13 @@ HRESULT WINAPI CNetConUiObject::InvokeCommand(LPCMINVOKECOMMANDINFO lpcmi)
case IDS_NET_RENAME: case IDS_NET_RENAME:
{ {
HRESULT hr; HRESULT hr;
IShellView *psv; CComPtr<IShellView> psv;
hr = IUnknown_QueryService(m_pUnknown, SID_IFolderView, IID_IShellView, (PVOID*)&psv); hr = IUnknown_QueryService(m_pUnknown, SID_IFolderView, IID_PPV_ARG(IShellView, &psv));
if (SUCCEEDED(hr)) if (SUCCEEDED(hr))
{ {
SVSIF selFlags = SVSI_DESELECTOTHERS | SVSI_EDIT | SVSI_ENSUREVISIBLE | SVSI_FOCUSED | SVSI_SELECT; SVSIF selFlags = SVSI_DESELECTOTHERS | SVSI_EDIT | SVSI_ENSUREVISIBLE | SVSI_FOCUSED | SVSI_SELECT;
psv->SelectItem(m_pidl, selFlags); psv->SelectItem(m_pidl, selFlags);
} }
psv->Release();
return S_OK; return S_OK;
} }
@ -793,45 +775,18 @@ HRESULT WINAPI CNetConUiObject::HandleMenuMsg2(
HRESULT WINAPI CNetConUiObject::GetSite(REFIID riid, PVOID *ppvSite) HRESULT WINAPI CNetConUiObject::GetSite(REFIID riid, PVOID *ppvSite)
{ {
HRESULT hr;
IUnknown *pUnknown;
if (!m_pUnknown) if (!m_pUnknown)
{ {
*ppvSite = NULL; *ppvSite = NULL;
return E_FAIL; return E_FAIL;
} }
hr = m_pUnknown->QueryInterface(riid, reinterpret_cast<PVOID*>(&pUnknown)); return m_pUnknown->QueryInterface(riid, ppvSite);
if (SUCCEEDED(hr))
{
pUnknown->AddRef();
*ppvSite = pUnknown;
return S_OK;
}
*ppvSite = NULL;
return hr;
} }
HRESULT WINAPI CNetConUiObject::SetSite(IUnknown *pUnkSite) HRESULT WINAPI CNetConUiObject::SetSite(IUnknown *pUnkSite)
{ {
if (!pUnkSite) m_pUnknown = pUnkSite;
{
if (m_pUnknown)
{
m_pUnknown->Release();
m_pUnknown = NULL;
}
}
else
{
pUnkSite->AddRef();
if (m_pUnknown)
m_pUnknown->Release();
m_pUnknown = pUnkSite;
}
return S_OK; return S_OK;
} }

View file

@ -64,7 +64,7 @@ class CNetworkConnections:
/* both paths are parsible from the desktop */ /* both paths are parsible from the desktop */
PIDLIST_ABSOLUTE m_pidlRoot; PIDLIST_ABSOLUTE m_pidlRoot;
IOleCommandTarget *m_lpOleCmd; CComPtr<IOleCommandTarget> m_lpOleCmd;
public: public:
@ -94,8 +94,8 @@ class CNetConUiObject:
{ {
private: private:
PCUITEMID_CHILD m_pidl; PCUITEMID_CHILD m_pidl;
IUnknown *m_pUnknown; CComPtr<IUnknown> m_pUnknown;
IOleCommandTarget *m_lpOleCmd; CComPtr<IOleCommandTarget> m_lpOleCmd;
public: public:
CNetConUiObject(); CNetConUiObject();