[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()
{
HRESULT hr;
INetConnectionManager *pNetConMan;
IEnumNetConnection *pEnumCon;
INetConnection *INetCon;
CComPtr<INetConnectionManager> pNetConMan;
CComPtr<IEnumNetConnection> pEnumCon;
ULONG Count;
PITEMID_CHILD pidl;
/* get an instance to of IConnectionManager */
hr = CNetConnectionManager_CreateInstance(IID_INetConnectionManager, (LPVOID*)&pNetConMan);
if (FAILED(hr))
hr = CNetConnectionManager_CreateInstance(IID_PPV_ARG(INetConnectionManager, &pNetConMan));
if (FAILED_UNEXPECTEDLY(hr))
return S_OK;
hr = pNetConMan->EnumConnections(NCME_DEFAULT, &pEnumCon);
if (FAILED(hr))
{
pNetConMan->Release();
if (FAILED_UNEXPECTEDLY(hr))
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
{
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;
return S_OK;
}
HRESULT

View file

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

View file

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

View file

@ -903,9 +903,9 @@ CLanStatus::InitializeNetTaskbarNotifications()
{
NOTIFYICONDATAW nid;
HWND hwndDlg;
INetConnectionManager *pNetConMan;
IEnumNetConnection *pEnumCon;
INetConnection *pNetCon;
CComPtr<INetConnectionManager> pNetConMan;
CComPtr<IEnumNetConnection> pEnumCon;
CComPtr<INetConnection> pNetCon;
NETCON_PROPERTIES* pProps;
HRESULT hr;
ULONG Count;
@ -942,108 +942,100 @@ CLanStatus::InitializeNetTaskbarNotifications()
return S_OK;
}
/* get an instance to of IConnectionManager */
//hr = CoCreateInstance(&CLSID_ConnectionManager, NULL, CLSCTX_INPROC_SERVER, &IID_INetConnectionManager, (LPVOID*)&pNetConMan);
hr = CNetConnectionManager_CreateInstance(IID_INetConnectionManager, (LPVOID*)&pNetConMan);
if (FAILED(hr))
{
ERR("CNetConnectionManager_CreateInstance failed\n");
hr = CNetConnectionManager_CreateInstance(IID_PPV_ARG(INetConnectionManager, &pNetConMan));
if (FAILED_UNEXPECTEDLY(hr))
return hr;
}
hr = pNetConMan->EnumConnections(NCME_DEFAULT, &pEnumCon);
if (FAILED(hr))
{
ERR("EnumConnections failed\n");
pNetConMan->Release();
if (FAILED_UNEXPECTEDLY(hr))
return hr;
}
Index = 1;
do
while (TRUE)
{
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");
pItem = static_cast<NOTIFICATION_ITEM*>(CoTaskMemAlloc(sizeof(NOTIFICATION_ITEM)));
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");
CoTaskMemFree(pItem);
break;
}
} 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;
pEnumCon->Release();
return S_OK;
}

View file

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

View file

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

View file

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