[NETSHELL] Use ATL

This commit is contained in:
Giannis Adamopoulos 2018-11-12 13:23:38 +02:00
parent 8d47872ea0
commit c73d8c64bb
15 changed files with 601 additions and 1052 deletions

View file

@ -11,6 +11,11 @@ endif()
remove_definitions(-D_WIN32_WINNT=0x502) remove_definitions(-D_WIN32_WINNT=0x502)
add_definitions(-D_WIN32_WINNT=0x600) add_definitions(-D_WIN32_WINNT=0x600)
add_definitions(
-D_ATL_NO_EXCEPTIONS)
include_directories(${REACTOS_SOURCE_DIR}/sdk/lib/atl)
add_definitions(-D_NETSHELL_) add_definitions(-D_NETSHELL_)
spec2def(netshell.dll netshell.spec) spec2def(netshell.dll netshell.spec)
@ -18,7 +23,6 @@ list(APPEND SOURCE
netshell.cpp netshell.cpp
shfldr_netconnect.cpp shfldr_netconnect.cpp
enumlist.cpp enumlist.cpp
classfactory.cpp
connectmanager.cpp connectmanager.cpp
lanconnectui.cpp lanconnectui.cpp
lanstatusui.cpp lanstatusui.cpp
@ -34,8 +38,9 @@ add_library(netshell SHARED
${CMAKE_CURRENT_BINARY_DIR}/netshell_stubs.c ${CMAKE_CURRENT_BINARY_DIR}/netshell_stubs.c
${CMAKE_CURRENT_BINARY_DIR}/netshell.def) ${CMAKE_CURRENT_BINARY_DIR}/netshell.def)
set_module_type(netshell win32dll) set_module_type(netshell win32dll UNICODE)
target_link_libraries(netshell uuid wine) target_link_libraries(netshell atlnew uuid wine)
add_importlibs(netshell shlwapi shell32 version iphlpapi ole32 gdi32 user32 advapi32 setupapi ws2_32 comctl32 msvcrt kernel32 ntdll) add_delay_importlibs(netshell ole32 oleaut32 shlwapi shell32)
add_importlibs(netshell version iphlpapi gdi32 user32 advapi32 setupapi ws2_32 comctl32 msvcrt kernel32 ntdll)
add_pch(netshell precomp.h SOURCE) add_pch(netshell precomp.h SOURCE)
add_cd_file(TARGET netshell DESTINATION reactos/system32 FOR all) add_cd_file(TARGET netshell DESTINATION reactos/system32 FOR all)

View file

@ -1,105 +0,0 @@
#include "precomp.h"
class CNetshellClassFactory final :
public IClassFactory
{
public:
CNetshellClassFactory(REFCLSID rclsid);
/* IUnknown */
virtual HRESULT WINAPI QueryInterface(REFIID riid, LPVOID *ppvOut);
virtual ULONG WINAPI AddRef();
virtual ULONG WINAPI Release();
/* IClassFactory */
virtual HRESULT WINAPI CreateInstance(LPUNKNOWN pUnkOuter, REFIID riid, LPVOID *ppvObject);
virtual HRESULT WINAPI LockServer(BOOL fLock);
private:
LONG m_ref;
CLSID m_clsid;
};
CNetshellClassFactory::CNetshellClassFactory(REFCLSID rclsid) :
m_ref(0),
m_clsid(rclsid)
{
}
HRESULT
WINAPI
CNetshellClassFactory::QueryInterface(
REFIID riid,
LPVOID *ppvObj)
{
*ppvObj = NULL;
if (IsEqualIID(riid, IID_IUnknown) || IsEqualIID(riid, IID_IClassFactory))
{
*ppvObj = static_cast<IClassFactory*>(this);
AddRef();
return S_OK;
}
return E_NOINTERFACE;
}
ULONG
WINAPI
CNetshellClassFactory::AddRef()
{
ULONG refCount = InterlockedIncrement(&m_ref);
return refCount;
}
ULONG
WINAPI
CNetshellClassFactory::Release()
{
ULONG refCount = InterlockedDecrement(&m_ref);
if (!refCount)
delete this;
return refCount;
}
HRESULT
WINAPI
CNetshellClassFactory::CreateInstance(
LPUNKNOWN pUnkOuter,
REFIID riid,
LPVOID *ppvObject)
{
*ppvObject = NULL;
if (IsEqualCLSID(m_clsid, CLSID_ConnectionFolder))
return ISF_NetConnect_Constructor(pUnkOuter, riid, ppvObject);
else if (IsEqualCLSID(m_clsid, CLSID_ConnectionManager))
return INetConnectionManager_Constructor(pUnkOuter, riid, ppvObject);
else if (IsEqualCLSID(m_clsid, CLSID_LanConnectionUi))
return LanConnectUI_Constructor(pUnkOuter, riid, ppvObject);
else if (IsEqualCLSID(m_clsid, CLSID_ConnectionTray))
return LanConnectStatusUI_Constructor(pUnkOuter, riid, ppvObject);
return E_NOINTERFACE;
}
HRESULT
WINAPI
CNetshellClassFactory::LockServer(BOOL fLock)
{
return E_NOTIMPL;
}
HRESULT IClassFactory_fnConstructor(REFCLSID rclsid, REFIID riid, LPVOID *ppvOut)
{
CNetshellClassFactory *pClsFactory = new CNetshellClassFactory(rclsid);
if (!pClsFactory)
return E_OUTOFMEMORY;
pClsFactory->AddRef();
HRESULT hr = pClsFactory->QueryInterface(riid, ppvOut);
pClsFactory->Release();
return hr;
}

View file

@ -7,146 +7,19 @@
#include "precomp.h" #include "precomp.h"
typedef struct tagINetConnectionItem
{
struct tagINetConnectionItem * Next;
DWORD dwAdapterIndex;
NETCON_PROPERTIES Props;
} INetConnectionItem, *PINetConnectionItem;
class CNetConnectionManager final :
public INetConnectionManager,
public IEnumNetConnection
{
public:
CNetConnectionManager();
BOOL EnumerateINetConnections();
// IUnknown
virtual HRESULT WINAPI QueryInterface(REFIID riid, LPVOID *ppvOut);
virtual ULONG WINAPI AddRef();
virtual ULONG WINAPI Release();
// INetConnectionManager
virtual HRESULT WINAPI EnumConnections(NETCONMGR_ENUM_FLAGS Flags, IEnumNetConnection **ppEnum);
// IEnumNetConnection
virtual HRESULT WINAPI Next(ULONG celt, INetConnection **rgelt, ULONG *pceltFetched);
virtual HRESULT WINAPI Skip(ULONG celt);
virtual HRESULT WINAPI Reset();
virtual HRESULT WINAPI Clone(IEnumNetConnection **ppenum);
private:
LONG m_ref;
PINetConnectionItem m_pHead;
PINetConnectionItem m_pCurrent;
};
class CNetConnection final :
public INetConnection
{
public:
CNetConnection(PINetConnectionItem pItem);
// IUnknown
virtual HRESULT WINAPI QueryInterface(REFIID riid, LPVOID *ppvOut);
virtual ULONG WINAPI AddRef();
virtual ULONG WINAPI Release();
// INetConnection
HRESULT WINAPI Connect();
HRESULT WINAPI Disconnect();
HRESULT WINAPI Delete();
HRESULT WINAPI Duplicate(LPCWSTR pszwDuplicateName, INetConnection **ppCon);
HRESULT WINAPI GetProperties(NETCON_PROPERTIES **ppProps);
HRESULT WINAPI GetUiObjectClassId(CLSID *pclsid);
HRESULT WINAPI Rename(LPCWSTR pszwDuplicateName);
private:
~CNetConnection();
LONG m_ref;
NETCON_PROPERTIES m_Props;
DWORD m_dwAdapterIndex;
};
VOID NormalizeOperStatus(MIB_IFROW *IfEntry, NETCON_PROPERTIES * Props); VOID NormalizeOperStatus(MIB_IFROW *IfEntry, NETCON_PROPERTIES * Props);
CNetConnectionManager::CNetConnectionManager() :
m_ref(0),
m_pHead(NULL),
m_pCurrent(NULL)
{
}
HRESULT
WINAPI
CNetConnectionManager::QueryInterface(
REFIID iid,
LPVOID *ppvObj)
{
*ppvObj = NULL;
if (IsEqualIID(iid, IID_IUnknown) ||
IsEqualIID(iid, IID_INetConnectionManager))
{
*ppvObj = static_cast<INetConnectionManager*>(this);
AddRef();
return S_OK;
}
return E_NOINTERFACE;
}
ULONG
WINAPI
CNetConnectionManager::AddRef()
{
ULONG refCount = InterlockedIncrement(&m_ref);
return refCount;
}
ULONG
WINAPI
CNetConnectionManager::Release()
{
ULONG refCount = InterlockedDecrement(&m_ref);
if (!refCount)
delete this;
return refCount;
}
HRESULT
WINAPI
CNetConnectionManager::EnumConnections(
NETCONMGR_ENUM_FLAGS Flags,
IEnumNetConnection **ppEnum)
{
TRACE("EnumConnections\n");
if (!ppEnum)
return E_POINTER;
if (Flags != NCME_DEFAULT)
return E_FAIL;
*ppEnum = static_cast<IEnumNetConnection*>(this);
AddRef();
return S_OK;
}
/*************************************************************** /***************************************************************
* INetConnection Interface * INetConnection Interface
*/ */
CNetConnection::CNetConnection(PINetConnectionItem pItem) : HRESULT
m_ref(0), WINAPI
m_Props(pItem->Props), CNetConnection::Initialize(PINetConnectionItem pItem)
m_dwAdapterIndex(pItem->dwAdapterIndex)
{ {
m_Props = pItem->Props;
m_dwAdapterIndex = pItem->dwAdapterIndex;
if (pItem->Props.pszwName) if (pItem->Props.pszwName)
{ {
m_Props.pszwName = static_cast<PWSTR>(CoTaskMemAlloc((wcslen(pItem->Props.pszwName)+1)*sizeof(WCHAR))); m_Props.pszwName = static_cast<PWSTR>(CoTaskMemAlloc((wcslen(pItem->Props.pszwName)+1)*sizeof(WCHAR)));
@ -160,6 +33,8 @@ CNetConnection::CNetConnection(PINetConnectionItem pItem) :
if (m_Props.pszwDeviceName) if (m_Props.pszwDeviceName)
wcscpy(m_Props.pszwDeviceName, pItem->Props.pszwDeviceName); wcscpy(m_Props.pszwDeviceName, pItem->Props.pszwDeviceName);
} }
return S_OK;
} }
CNetConnection::~CNetConnection() CNetConnection::~CNetConnection()
@ -168,46 +43,6 @@ CNetConnection::~CNetConnection()
CoTaskMemFree(m_Props.pszwDeviceName); CoTaskMemFree(m_Props.pszwDeviceName);
} }
HRESULT
WINAPI
CNetConnection::QueryInterface(
REFIID iid,
LPVOID * ppvObj)
{
*ppvObj = NULL;
if (IsEqualIID(iid, IID_IUnknown) ||
IsEqualIID(iid, IID_INetConnection))
{
*ppvObj = this;
AddRef();
return S_OK;
}
return E_NOINTERFACE;
}
ULONG
WINAPI
CNetConnection::AddRef()
{
ULONG refCount = InterlockedIncrement(&m_ref);
return refCount;
}
ULONG
WINAPI
CNetConnection::Release()
{
ULONG refCount = InterlockedDecrement(&m_ref);
if (!refCount)
delete this;
return refCount;
}
HRESULT HRESULT
WINAPI WINAPI
CNetConnection::Connect() CNetConnection::Connect()
@ -390,22 +225,38 @@ CNetConnection::Rename(LPCWSTR pszwDuplicateName)
return hr; return hr;
} }
HRESULT WINAPI IConnection_Constructor(INetConnection **ppv, PINetConnectionItem pItem) HRESULT WINAPI CNetConnection_CreateInstance(PINetConnectionItem pItem, REFIID riid, LPVOID * ppv)
{ {
if (!ppv) return ShellObjectCreatorInit<CNetConnection>(pItem, riid, ppv);
return E_POINTER;
CNetConnection *pConnection = new CNetConnection(pItem);
if (!pConnection)
return E_OUTOFMEMORY;
pConnection->AddRef();
*ppv = pConnection;
return S_OK;
} }
CNetConnectionManager::CNetConnectionManager() :
m_pHead(NULL),
m_pCurrent(NULL)
{
}
HRESULT
WINAPI
CNetConnectionManager::EnumConnections(
NETCONMGR_ENUM_FLAGS Flags,
IEnumNetConnection **ppEnum)
{
TRACE("EnumConnections\n");
if (!ppEnum)
return E_POINTER;
if (Flags != NCME_DEFAULT)
return E_FAIL;
*ppEnum = static_cast<IEnumNetConnection*>(this);
AddRef();
return S_OK;
}
/*************************************************************** /***************************************************************
* IEnumNetConnection Interface * IEnumNetConnection Interface
*/ */
@ -428,7 +279,7 @@ CNetConnectionManager::Next(
if (!m_pCurrent) if (!m_pCurrent)
return S_FALSE; return S_FALSE;
hr = IConnection_Constructor(rgelt, m_pCurrent); hr = CNetConnection_CreateInstance(m_pCurrent, IID_PPV_ARG(INetConnection, rgelt));
m_pCurrent = m_pCurrent->Next; m_pCurrent = m_pCurrent->Next;
return hr; return hr;
@ -517,7 +368,7 @@ NormalizeOperStatus(
} }
} }
BOOL HRESULT
CNetConnectionManager::EnumerateINetConnections() CNetConnectionManager::EnumerateINetConnections()
{ {
DWORD dwSize, dwResult, dwIndex, dwAdapterIndex, dwShowIcon, dwNotifyDisconnect; DWORD dwSize, dwResult, dwIndex, dwAdapterIndex, dwShowIcon, dwNotifyDisconnect;
@ -536,17 +387,17 @@ CNetConnectionManager::EnumerateINetConnections()
/* get the IfTable */ /* get the IfTable */
dwSize = 0; dwSize = 0;
if (GetIfTable(NULL, &dwSize, TRUE) != ERROR_INSUFFICIENT_BUFFER) if (GetIfTable(NULL, &dwSize, TRUE) != ERROR_INSUFFICIENT_BUFFER)
return FALSE; return E_FAIL;
pIfTable = static_cast<PMIB_IFTABLE>(CoTaskMemAlloc(dwSize)); pIfTable = static_cast<PMIB_IFTABLE>(CoTaskMemAlloc(dwSize));
if (!pIfTable) if (!pIfTable)
return FALSE; return E_OUTOFMEMORY;
dwResult = GetIfTable(pIfTable, &dwSize, TRUE); dwResult = GetIfTable(pIfTable, &dwSize, TRUE);
if (dwResult != NO_ERROR) if (dwResult != NO_ERROR)
{ {
CoTaskMemFree(pIfTable); CoTaskMemFree(pIfTable);
return FALSE; return HRESULT_FROM_WIN32(dwResult);
} }
dwSize = 0; dwSize = 0;
@ -554,21 +405,22 @@ CNetConnectionManager::EnumerateINetConnections()
if (dwResult!= ERROR_BUFFER_OVERFLOW) if (dwResult!= ERROR_BUFFER_OVERFLOW)
{ {
CoTaskMemFree(pIfTable); CoTaskMemFree(pIfTable);
return FALSE; return HRESULT_FROM_WIN32(dwResult);
} }
pAdapterInfo = static_cast<PIP_ADAPTER_INFO>(CoTaskMemAlloc(dwSize)); pAdapterInfo = static_cast<PIP_ADAPTER_INFO>(CoTaskMemAlloc(dwSize));
if (!pAdapterInfo) if (!pAdapterInfo)
{ {
CoTaskMemFree(pIfTable); CoTaskMemFree(pIfTable);
return FALSE; return E_OUTOFMEMORY;
} }
if (GetAdaptersInfo(pAdapterInfo, &dwSize) != NO_ERROR) dwResult = GetAdaptersInfo(pAdapterInfo, &dwSize);
if (dwResult != NO_ERROR)
{ {
CoTaskMemFree(pIfTable); CoTaskMemFree(pIfTable);
CoTaskMemFree(pAdapterInfo); CoTaskMemFree(pAdapterInfo);
return FALSE; return HRESULT_FROM_WIN32(dwResult);
} }
hInfo = SetupDiGetClassDevs(&GUID_DEVCLASS_NET, NULL, NULL, DIGCF_PRESENT ); hInfo = SetupDiGetClassDevs(&GUID_DEVCLASS_NET, NULL, NULL, DIGCF_PRESENT );
@ -576,7 +428,7 @@ CNetConnectionManager::EnumerateINetConnections()
{ {
CoTaskMemFree(pIfTable); CoTaskMemFree(pIfTable);
CoTaskMemFree(pAdapterInfo); CoTaskMemFree(pAdapterInfo);
return FALSE; return E_FAIL;
} }
dwIndex = 0; dwIndex = 0;
@ -690,31 +542,22 @@ CNetConnectionManager::EnumerateINetConnections()
SetupDiDestroyDeviceInfoList(hInfo); SetupDiDestroyDeviceInfoList(hInfo);
m_pCurrent = m_pHead; m_pCurrent = m_pHead;
return TRUE; return (m_pHead != NULL ? S_OK : S_FALSE);
} }
HRESULT WINAPI INetConnectionManager_Constructor(IUnknown *pUnkOuter, REFIID riid, LPVOID * ppv) HRESULT CNetConnectionManager::Initialize()
{ {
TRACE("INetConnectionManager_Constructor\n"); HRESULT hr = EnumerateINetConnections();
if (FAILED_UNEXPECTEDLY(hr))
if (!ppv) {
return E_POINTER; /* If something went wrong during the enumeration print an error don't enumerate anything */
if (pUnkOuter) m_pCurrent = m_pHead = NULL;
return CLASS_E_NOAGGREGATION; return S_FALSE;
}
CNetConnectionManager *pConnectionMgr = new CNetConnectionManager; return S_OK;
if (!pConnectionMgr)
return E_OUTOFMEMORY;
pConnectionMgr->AddRef();
HRESULT hr = pConnectionMgr->QueryInterface(riid, ppv);
if (SUCCEEDED(hr))
pConnectionMgr->EnumerateINetConnections();
pConnectionMgr->Release();
return hr;
} }
HRESULT WINAPI CNetConnectionManager_CreateInstance(REFIID riid, LPVOID * ppv)
{
return ShellObjectCreatorInit<CNetConnectionManager>(riid, ppv);
}

View file

@ -0,0 +1,75 @@
typedef struct tagINetConnectionItem
{
struct tagINetConnectionItem * Next;
DWORD dwAdapterIndex;
NETCON_PROPERTIES Props;
} INetConnectionItem, *PINetConnectionItem;
class CNetConnectionManager:
public CComCoClass<CNetConnectionManager, &CLSID_ConnectionManager>,
public CComObjectRootEx<CComMultiThreadModelNoCS>,
public INetConnectionManager,
public IEnumNetConnection
{
public:
CNetConnectionManager();
HRESULT Initialize();
HRESULT EnumerateINetConnections();
// INetConnectionManager
virtual HRESULT WINAPI EnumConnections(NETCONMGR_ENUM_FLAGS Flags, IEnumNetConnection **ppEnum);
// IEnumNetConnection
virtual HRESULT WINAPI Next(ULONG celt, INetConnection **rgelt, ULONG *pceltFetched);
virtual HRESULT WINAPI Skip(ULONG celt);
virtual HRESULT WINAPI Reset();
virtual HRESULT WINAPI Clone(IEnumNetConnection **ppenum);
private:
PINetConnectionItem m_pHead;
PINetConnectionItem m_pCurrent;
public:
DECLARE_NO_REGISTRY()
DECLARE_NOT_AGGREGATABLE(CNetConnectionManager)
DECLARE_PROTECT_FINAL_CONSTRUCT()
BEGIN_COM_MAP(CNetConnectionManager)
COM_INTERFACE_ENTRY_IID(IID_INetConnectionManager, INetConnectionManager)
COM_INTERFACE_ENTRY_IID(IID_IEnumNetConnection, IEnumNetConnection)
END_COM_MAP()
};
class CNetConnection:
public CComObjectRootEx<CComMultiThreadModelNoCS>,
public INetConnection
{
private:
NETCON_PROPERTIES m_Props;
DWORD m_dwAdapterIndex;
public:
~CNetConnection();
HRESULT WINAPI Initialize(PINetConnectionItem pItem);
// INetConnection
HRESULT WINAPI Connect();
HRESULT WINAPI Disconnect();
HRESULT WINAPI Delete();
HRESULT WINAPI Duplicate(LPCWSTR pszwDuplicateName, INetConnection **ppCon);
HRESULT WINAPI GetProperties(NETCON_PROPERTIES **ppProps);
HRESULT WINAPI GetUiObjectClassId(CLSID *pclsid);
HRESULT WINAPI Rename(LPCWSTR pszwDuplicateName);
DECLARE_NOT_AGGREGATABLE(CNetConnection)
DECLARE_PROTECT_FINAL_CONSTRUCT()
BEGIN_COM_MAP(CNetConnection)
COM_INTERFACE_ENTRY_IID(IID_INetConnection, INetConnection)
END_COM_MAP()
};
BOOL GetAdapterIndexFromNetCfgInstanceId(PIP_ADAPTER_INFO pAdapterInfo, LPWSTR szNetCfg, PDWORD pIndex);
HRESULT WINAPI CNetConnectionManager_CreateInstance(REFIID riid, LPVOID * ppv);

View file

@ -7,6 +7,63 @@
#include "precomp.h" #include "precomp.h"
typedef struct tagGUIDStruct
{
BYTE dummy; /* offset 01 is unknown */
GUID guid; /* offset 02 */
} GUIDStruct;
#define PT_GUID 0x1F
typedef struct tagPIDLDATA
{
BYTE type; /*00*/
union
{
struct tagGUIDStruct guid;
struct tagVALUEStruct value;
} u;
} PIDLDATA, *LPPIDLDATA;
typedef struct tagENUMLIST
{
struct tagENUMLIST *pNext;
PITEMID_CHILD pidl;
} ENUMLIST, *LPENUMLIST;
class CEnumIDList:
public CComObjectRootEx<CComMultiThreadModelNoCS>,
public IEnumIDList
{
public:
CEnumIDList();
~CEnumIDList();
HRESULT Initialize();
// IEnumIDList
virtual HRESULT STDMETHODCALLTYPE Next(ULONG celt, PITEMID_CHILD *rgelt, ULONG *pceltFetched);
virtual HRESULT STDMETHODCALLTYPE Skip(ULONG celt);
virtual HRESULT STDMETHODCALLTYPE Reset();
virtual HRESULT STDMETHODCALLTYPE Clone(IEnumIDList **ppenum);
private:
BOOL AddToEnumList(PITEMID_CHILD pidl);
LPENUMLIST m_pFirst;
LPENUMLIST m_pLast;
LPENUMLIST m_pCurrent;
public:
DECLARE_NOT_AGGREGATABLE(CEnumIDList)
DECLARE_PROTECT_FINAL_CONSTRUCT()
BEGIN_COM_MAP(CEnumIDList)
COM_INTERFACE_ENTRY_IID(IID_IEnumIDList, IEnumIDList)
END_COM_MAP()
};
/************************************************************************** /**************************************************************************
* AddToEnumList() * AddToEnumList()
*/ */
@ -44,7 +101,6 @@ CEnumIDList::AddToEnumList(PITEMID_CHILD pidl)
} }
CEnumIDList::CEnumIDList() : CEnumIDList::CEnumIDList() :
m_ref(0),
m_pFirst(NULL), m_pFirst(NULL),
m_pLast(NULL), m_pLast(NULL),
m_pCurrent(NULL) m_pCurrent(NULL)
@ -65,41 +121,48 @@ CEnumIDList::~CEnumIDList()
} }
HRESULT HRESULT
WINAPI CEnumIDList::Initialize()
CEnumIDList::QueryInterface(
REFIID riid,
LPVOID *ppvObj)
{ {
*ppvObj = NULL; HRESULT hr;
INetConnectionManager *pNetConMan;
IEnumNetConnection *pEnumCon;
INetConnection *INetCon;
ULONG Count;
PITEMID_CHILD pidl;
if (IsEqualIID(riid, IID_IUnknown) || IsEqualIID(riid, IID_IEnumIDList)) /* get an instance to of IConnectionManager */
hr = CNetConnectionManager_CreateInstance(IID_INetConnectionManager, (LPVOID*)&pNetConMan);
if (FAILED(hr))
return S_OK;
hr = pNetConMan->EnumConnections(NCME_DEFAULT, &pEnumCon);
if (FAILED(hr))
{ {
*ppvObj = static_cast<IEnumIDList*>(this); pNetConMan->Release();
AddRef();
return S_OK; return S_OK;
} }
return E_NOINTERFACE; do
} {
hr = pEnumCon->Next(1, &INetCon, &Count);
if (hr == S_OK)
{
pidl = ILCreateNetConnectItem(INetCon);
if (pidl)
{
AddToEnumList(pidl);
}
}
else
{
break;
}
} while (TRUE);
ULONG pEnumCon->Release();
WINAPI pNetConMan->Release();
CEnumIDList::AddRef()
{
ULONG refCount = InterlockedIncrement(&m_ref);
return refCount; return S_OK;
}
ULONG
WINAPI CEnumIDList::Release()
{
ULONG refCount = InterlockedDecrement(&m_ref);
if (!refCount)
delete this;
return refCount;
} }
HRESULT HRESULT
@ -264,3 +327,8 @@ const VALUEStruct * _ILGetValueStruct(LPCITEMIDLIST pidl)
return NULL; return NULL;
} }
HRESULT CEnumIDList_CreateInstance(HWND hwndOwner, DWORD dwFlags, REFIID riid, LPVOID * ppv)
{
return ShellObjectCreatorInit<CEnumIDList>(riid, ppv);
}

View file

@ -1,52 +0,0 @@
#pragma once
typedef struct tagGUIDStruct
{
BYTE dummy; /* offset 01 is unknown */
GUID guid; /* offset 02 */
} GUIDStruct;
#define PT_GUID 0x1F
typedef struct tagPIDLDATA
{
BYTE type; /*00*/
union
{
struct tagGUIDStruct guid;
struct tagVALUEStruct value;
} u;
} PIDLDATA, *LPPIDLDATA;
typedef struct tagENUMLIST
{
struct tagENUMLIST *pNext;
PITEMID_CHILD pidl;
} ENUMLIST, *LPENUMLIST;
class CEnumIDList final :
public IEnumIDList
{
public:
CEnumIDList();
BOOL AddToEnumList(PITEMID_CHILD pidl);
// IUnknown
virtual HRESULT WINAPI QueryInterface(REFIID riid, LPVOID *ppvOut);
virtual ULONG WINAPI AddRef();
virtual ULONG WINAPI Release();
// IEnumIDList
virtual HRESULT STDMETHODCALLTYPE Next(ULONG celt, PITEMID_CHILD *rgelt, ULONG *pceltFetched);
virtual HRESULT STDMETHODCALLTYPE Skip(ULONG celt);
virtual HRESULT STDMETHODCALLTYPE Reset();
virtual HRESULT STDMETHODCALLTYPE Clone(IEnumIDList **ppenum);
private:
~CEnumIDList();
LONG m_ref;
LPENUMLIST m_pFirst;
LPENUMLIST m_pLast;
LPENUMLIST m_pCurrent;
};

View file

@ -7,78 +7,11 @@
#include "precomp.h" #include "precomp.h"
#include <netcfgx.h>
#include <netcfgn.h>
#include <strsafe.h>
/// CLASSID
/// {7007ACC5-3202-11D1-AAD2-00805FC1270E}
/// open network properties and wlan properties
typedef enum
{
NET_TYPE_CLIENT = 1,
NET_TYPE_SERVICE = 2,
NET_TYPE_PROTOCOL = 3
} NET_TYPE;
typedef struct
{
NET_TYPE Type;
DWORD dwCharacteristics;
LPWSTR szHelp;
INetCfgComponent *pNCfgComp;
UINT NumPropDialogOpen;
} NET_ITEM, *PNET_ITEM;
class CNetConnectionPropertyUi final :
public INetConnectionConnectUi,
public INetConnectionPropertyUi2,
public INetLanConnectionUiInfo
{
public:
CNetConnectionPropertyUi();
// IUnknown
virtual HRESULT WINAPI QueryInterface(REFIID riid, LPVOID *ppvOut);
virtual ULONG WINAPI AddRef();
virtual ULONG WINAPI Release();
// INetConnectionPropertyUi2
virtual HRESULT WINAPI AddPages(HWND hwndParent, LPFNADDPROPSHEETPAGE pfnAddPage, LPARAM lParam);
virtual HRESULT WINAPI GetIcon(DWORD dwSize, HICON *phIcon);
// INetLanConnectionUiInfo
virtual HRESULT WINAPI GetDeviceGuid(GUID *pGuid);
// INetConnectionConnectUi
virtual HRESULT WINAPI SetConnection(INetConnection* pCon);
virtual HRESULT WINAPI Connect(HWND hwndParent, DWORD dwFlags);
virtual HRESULT WINAPI Disconnect(HWND hwndParent, DWORD dwFlags);
private:
~CNetConnectionPropertyUi();
BOOL GetINetCfgComponent(INetCfg *pNCfg, INetCfgComponent ** pOut);
VOID EnumComponents(HWND hDlgCtrl, INetCfg *pNCfg, const GUID *CompGuid, UINT Type);
VOID InitializeLANPropertiesUIDlg(HWND hwndDlg);
VOID ShowNetworkComponentProperties(HWND hwndDlg);
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;
NETCON_PROPERTIES * m_pProperties;
LONG m_ref;
};
CNetConnectionPropertyUi::CNetConnectionPropertyUi() : CNetConnectionPropertyUi::CNetConnectionPropertyUi() :
m_pCon(NULL), m_pCon(NULL),
m_NCfgLock(NULL), m_NCfgLock(NULL),
m_pNCfg(NULL), m_pNCfg(NULL),
m_pProperties(NULL), m_pProperties(NULL)
m_ref(0)
{ {
} }
@ -99,26 +32,6 @@ CNetConnectionPropertyUi::~CNetConnectionPropertyUi()
} }
} }
HPROPSHEETPAGE
InitializePropertySheetPage(LPWSTR resname, DLGPROC dlgproc, LPARAM lParam, LPWSTR szTitle)
{
PROPSHEETPAGEW ppage;
memset(&ppage, 0x0, sizeof(PROPSHEETPAGEW));
ppage.dwSize = sizeof(PROPSHEETPAGEW);
ppage.dwFlags = PSP_DEFAULT;
ppage.pszTemplate = resname;
ppage.pfnDlgProc = dlgproc;
ppage.lParam = lParam;
ppage.hInstance = netshell_hInstance;
if (szTitle)
{
ppage.dwFlags |= PSP_USETITLE;
ppage.pszTitle = szTitle;
}
return CreatePropertySheetPageW(&ppage);
}
VOID VOID
AddItemToListView(HWND hDlgCtrl, PNET_ITEM pItem, LPWSTR szName, BOOL bChecked) AddItemToListView(HWND hDlgCtrl, PNET_ITEM pItem, LPWSTR szName, BOOL bChecked)
{ {
@ -528,59 +441,6 @@ CNetConnectionPropertyUi::GetDeviceInstanceID(
return FALSE; return FALSE;
} }
HRESULT
WINAPI
CNetConnectionPropertyUi::QueryInterface(
REFIID iid,
LPVOID *ppvObj)
{
*ppvObj = NULL;
if (IsEqualIID (iid, IID_IUnknown) ||
IsEqualIID (iid, IID_INetConnectionPropertyUi) ||
IsEqualIID (iid, IID_INetConnectionPropertyUi2))
{
*ppvObj = (INetConnectionPropertyUi2*)this;
AddRef();
return S_OK;
}
else if (IsEqualIID(iid, IID_INetLanConnectionUiInfo))
{
*ppvObj = (INetLanConnectionUiInfo*)this;
AddRef();
return S_OK;
}
else if (IsEqualIID(iid, IID_INetConnectionConnectUi))
{
*ppvObj = (INetConnectionConnectUi*)this;
AddRef();
return S_OK;
}
return E_NOINTERFACE;
}
ULONG
WINAPI
CNetConnectionPropertyUi::AddRef()
{
ULONG refCount = InterlockedIncrement(&m_ref);
return refCount;
}
ULONG
WINAPI
CNetConnectionPropertyUi::Release()
{
ULONG refCount = InterlockedDecrement(&m_ref);
if (!refCount)
delete this;
return refCount;
}
HRESULT HRESULT
WINAPI WINAPI
CNetConnectionPropertyUi::AddPages( CNetConnectionPropertyUi::AddPages(
@ -679,24 +539,3 @@ CNetConnectionPropertyUi::Disconnect(
return S_OK; return S_OK;
} }
HRESULT WINAPI LanConnectUI_Constructor(IUnknown * pUnkOuter, REFIID riid, LPVOID * ppv)
{
TRACE("LanConnectUI_Constructor\n");
if (!ppv)
return E_POINTER;
if (pUnkOuter)
return CLASS_E_NOAGGREGATION;
CNetConnectionPropertyUi *pConPropUi = new CNetConnectionPropertyUi;
if (!pConPropUi)
return E_OUTOFMEMORY;
pConPropUi->AddRef();
HRESULT hr = pConPropUi->QueryInterface(riid, ppv);
pConPropUi->Release();
return hr;
}

View file

@ -0,0 +1,69 @@
/// CLASSID
/// {7007ACC5-3202-11D1-AAD2-00805FC1270E}
/// open network properties and wlan properties
typedef enum
{
NET_TYPE_CLIENT = 1,
NET_TYPE_SERVICE = 2,
NET_TYPE_PROTOCOL = 3
} NET_TYPE;
typedef struct
{
NET_TYPE Type;
DWORD dwCharacteristics;
LPWSTR szHelp;
INetCfgComponent *pNCfgComp;
UINT NumPropDialogOpen;
} NET_ITEM, *PNET_ITEM;
class CNetConnectionPropertyUi:
public CComCoClass<CNetConnectionPropertyUi, &CLSID_LanConnectionUi>,
public CComObjectRootEx<CComMultiThreadModelNoCS>,
public INetConnectionConnectUi,
public INetConnectionPropertyUi2,
public INetLanConnectionUiInfo
{
public:
CNetConnectionPropertyUi();
~CNetConnectionPropertyUi();
// INetConnectionPropertyUi2
virtual HRESULT WINAPI AddPages(HWND hwndParent, LPFNADDPROPSHEETPAGE pfnAddPage, LPARAM lParam);
virtual HRESULT WINAPI GetIcon(DWORD dwSize, HICON *phIcon);
// INetLanConnectionUiInfo
virtual HRESULT WINAPI GetDeviceGuid(GUID *pGuid);
// INetConnectionConnectUi
virtual HRESULT WINAPI SetConnection(INetConnection* pCon);
virtual HRESULT WINAPI Connect(HWND hwndParent, DWORD dwFlags);
virtual HRESULT WINAPI Disconnect(HWND hwndParent, DWORD dwFlags);
private:
BOOL GetINetCfgComponent(INetCfg *pNCfg, INetCfgComponent ** pOut);
VOID EnumComponents(HWND hDlgCtrl, INetCfg *pNCfg, const GUID *CompGuid, UINT Type);
VOID InitializeLANPropertiesUIDlg(HWND hwndDlg);
VOID ShowNetworkComponentProperties(HWND hwndDlg);
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;
NETCON_PROPERTIES * m_pProperties;
public:
DECLARE_NO_REGISTRY()
DECLARE_NOT_AGGREGATABLE(CNetConnectionPropertyUi)
DECLARE_PROTECT_FINAL_CONSTRUCT()
BEGIN_COM_MAP(CNetConnectionPropertyUi)
COM_INTERFACE_ENTRY_IID(IID_INetConnectionConnectUi, INetConnectionConnectUi)
COM_INTERFACE_ENTRY_IID(IID_INetConnectionPropertyUi, INetConnectionPropertyUi2)
COM_INTERFACE_ENTRY_IID(IID_INetConnectionPropertyUi2, INetConnectionPropertyUi2)
COM_INTERFACE_ENTRY_IID(IID_INetLanConnectionUiInfo, INetLanConnectionUiInfo)
END_COM_MAP()
};

View file

@ -9,65 +9,8 @@
#include <winsock.h> #include <winsock.h>
/// CLSID
/// HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{7007ACCF-3202-11D1-AAD2-00805FC1270E}
// IID B722BCCB-4E68-101B-A2BC-00AA00404770
#define WM_SHOWSTATUSDLG (WM_USER+10)
typedef struct tagNotificationItem
{
struct tagNotificationItem *pNext;
CLSID guidItem;
UINT uID;
HWND hwndDlg;
INetConnection *pNet;
} NOTIFICATION_ITEM;
typedef struct
{
INetConnection *pNet;
HWND hwndStatusDlg; /* LanStatusDlg window */
HWND hwndDlg; /* status dialog window */
DWORD dwAdapterIndex;
UINT_PTR nIDEvent;
UINT DHCPEnabled;
DWORD dwInOctets;
DWORD dwOutOctets;
DWORD IpAddress;
DWORD SubnetMask;
DWORD Gateway;
UINT uID;
UINT Status;
} LANSTATUSUI_CONTEXT;
class CLanStatus final :
public IOleCommandTarget
{
public:
CLanStatus();
// IUnknown
virtual HRESULT WINAPI QueryInterface(REFIID riid, LPVOID *ppvOut);
virtual ULONG WINAPI AddRef();
virtual ULONG WINAPI Release();
// IOleCommandTarget
virtual HRESULT WINAPI QueryStatus(const GUID *pguidCmdGroup, ULONG cCmds, OLECMD *prgCmds, OLECMDTEXT *pCmdText);
virtual HRESULT WINAPI Exec(const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut);
private:
HRESULT InitializeNetTaskbarNotifications();
HRESULT ShowStatusDialogByCLSID(const GUID *pguidCmdGroup);
INetConnectionManager *m_lpNetMan;
LONG m_ref;
NOTIFICATION_ITEM *m_pHead;
};
CLanStatus::CLanStatus() : CLanStatus::CLanStatus() :
m_lpNetMan(NULL), m_lpNetMan(NULL),
m_ref(0),
m_pHead(NULL) m_pHead(NULL)
{ {
} }
@ -1002,10 +945,10 @@ CLanStatus::InitializeNetTaskbarNotifications()
//hr = CoCreateInstance(&CLSID_ConnectionManager, NULL, CLSCTX_INPROC_SERVER, &IID_INetConnectionManager, (LPVOID*)&pNetConMan); //hr = CoCreateInstance(&CLSID_ConnectionManager, NULL, CLSCTX_INPROC_SERVER, &IID_INetConnectionManager, (LPVOID*)&pNetConMan);
hr = INetConnectionManager_Constructor(NULL, IID_INetConnectionManager, (LPVOID*)&pNetConMan); hr = CNetConnectionManager_CreateInstance(IID_INetConnectionManager, (LPVOID*)&pNetConMan);
if (FAILED(hr)) if (FAILED(hr))
{ {
ERR("INetConnectionManager_Constructor failed\n"); ERR("CNetConnectionManager_CreateInstance failed\n");
return hr; return hr;
} }
@ -1124,46 +1067,6 @@ CLanStatus::ShowStatusDialogByCLSID(const GUID *pguidCmdGroup)
return E_FAIL; return E_FAIL;
} }
HRESULT
WINAPI
CLanStatus::QueryInterface(
REFIID iid,
LPVOID *ppvObj)
{
*ppvObj = NULL;
if (IsEqualIID(iid, IID_IUnknown) ||
IsEqualIID(iid, IID_IOleCommandTarget))
{
*ppvObj = this;
AddRef();
return S_OK;
}
return E_NOINTERFACE;
}
ULONG
WINAPI
CLanStatus::AddRef()
{
ULONG refCount = InterlockedIncrement(&m_ref);
return refCount;
}
ULONG
WINAPI
CLanStatus::Release()
{
ULONG refCount = InterlockedDecrement(&m_ref);
if (!refCount)
delete this;
return refCount;
}
HRESULT HRESULT
WINAPI WINAPI
CLanStatus::QueryStatus( CLanStatus::QueryStatus(
@ -1199,26 +1102,3 @@ CLanStatus::Exec(
} }
return S_OK; return S_OK;
} }
HRESULT WINAPI LanConnectStatusUI_Constructor(IUnknown *pUnkOuter, REFIID riid, LPVOID *ppv)
{
TRACE("LanConnectStatusUI_Constructor\n");
if (!ppv)
return E_POINTER;
if (pUnkOuter)
return CLASS_E_NOAGGREGATION;
CLanStatus *pLanStatus = new CLanStatus;
if (!pLanStatus)
return E_OUTOFMEMORY;
pLanStatus->AddRef();
static volatile CLanStatus *pCachedLanStatus = NULL;
if (InterlockedCompareExchangePointer((void **)&pCachedLanStatus, pLanStatus, NULL) != NULL)
pLanStatus->Release();
return ((CLanStatus*)pCachedLanStatus)->QueryInterface(riid, ppv);
}

View file

@ -0,0 +1,62 @@
/// CLSID
/// HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{7007ACCF-3202-11D1-AAD2-00805FC1270E}
// IID B722BCCB-4E68-101B-A2BC-00AA00404770
#define WM_SHOWSTATUSDLG (WM_USER+10)
typedef struct tagNotificationItem
{
struct tagNotificationItem *pNext;
CLSID guidItem;
UINT uID;
HWND hwndDlg;
INetConnection *pNet;
} NOTIFICATION_ITEM;
typedef struct
{
INetConnection *pNet;
HWND hwndStatusDlg; /* LanStatusDlg window */
HWND hwndDlg; /* status dialog window */
DWORD dwAdapterIndex;
UINT_PTR nIDEvent;
UINT DHCPEnabled;
DWORD dwInOctets;
DWORD dwOutOctets;
DWORD IpAddress;
DWORD SubnetMask;
DWORD Gateway;
UINT uID;
UINT Status;
} LANSTATUSUI_CONTEXT;
class CLanStatus:
public CComCoClass<CLanStatus, &CLSID_ConnectionTray>,
public CComObjectRootEx<CComMultiThreadModelNoCS>,
public IOleCommandTarget
{
public:
CLanStatus();
// IOleCommandTarget
virtual HRESULT WINAPI QueryStatus(const GUID *pguidCmdGroup, ULONG cCmds, OLECMD *prgCmds, OLECMDTEXT *pCmdText);
virtual HRESULT WINAPI Exec(const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut);
private:
HRESULT InitializeNetTaskbarNotifications();
HRESULT ShowStatusDialogByCLSID(const GUID *pguidCmdGroup);
INetConnectionManager *m_lpNetMan;
NOTIFICATION_ITEM *m_pHead;
public:
DECLARE_NO_REGISTRY()
DECLARE_CENTRAL_INSTANCE_NOT_AGGREGATABLE(CLanStatus)
DECLARE_PROTECT_FINAL_CONSTRUCT()
BEGIN_COM_MAP(CLanStatus)
COM_INTERFACE_ENTRY_IID(IID_IOleCommandTarget, IOleCommandTarget)
END_COM_MAP()
};

View file

@ -7,17 +7,47 @@
#include "precomp.h" #include "precomp.h"
#include <olectl.h> HMODULE g_hModule = NULL;
HINSTANCE netshell_hInstance; HINSTANCE netshell_hInstance;
class CNetshellModule : public CComModule
{
public:
};
BEGIN_OBJECT_MAP(ObjectMap)
OBJECT_ENTRY(CLSID_ConnectionFolder, CNetworkConnections)
OBJECT_ENTRY(CLSID_ConnectionManager, CNetConnectionManager)
OBJECT_ENTRY(CLSID_LanConnectionUi, CNetConnectionPropertyUi)
OBJECT_ENTRY(CLSID_ConnectionTray, CLanStatus)
END_OBJECT_MAP()
CNetshellModule gModule;
HPROPSHEETPAGE
InitializePropertySheetPage(LPWSTR resname, DLGPROC dlgproc, LPARAM lParam, LPWSTR szTitle)
{
PROPSHEETPAGEW ppage;
memset(&ppage, 0x0, sizeof(PROPSHEETPAGEW));
ppage.dwSize = sizeof(PROPSHEETPAGEW);
ppage.dwFlags = PSP_DEFAULT;
ppage.pszTemplate = resname;
ppage.pfnDlgProc = dlgproc;
ppage.lParam = lParam;
ppage.hInstance = netshell_hInstance;
if (szTitle)
{
ppage.dwFlags |= PSP_USETITLE;
ppage.pszTitle = szTitle;
}
return CreatePropertySheetPageW(&ppage);
}
extern "C" extern "C"
{ {
/* FIXME: rpcproxy.h */
HRESULT __wine_register_resources(HMODULE module);
HRESULT __wine_unregister_resources(HMODULE module);
BOOL BOOL
WINAPI WINAPI
DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID fImpLoad) DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID fImpLoad)
@ -27,6 +57,7 @@ DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID fImpLoad)
case DLL_PROCESS_ATTACH: case DLL_PROCESS_ATTACH:
netshell_hInstance = hinstDLL; netshell_hInstance = hinstDLL;
DisableThreadLibraryCalls(netshell_hInstance); DisableThreadLibraryCalls(netshell_hInstance);
gModule.Init(ObjectMap, netshell_hInstance, NULL);
break; break;
default: default:
break; break;
@ -45,13 +76,33 @@ DllCanUnloadNow(void)
STDAPI STDAPI
DllRegisterServer(void) DllRegisterServer(void)
{ {
return __wine_register_resources(netshell_hInstance); HRESULT hr;
hr = gModule.DllRegisterServer(FALSE);
if (FAILED_UNEXPECTEDLY(hr))
return hr;
hr = gModule.UpdateRegistryFromResource(IDR_NETSHELL, TRUE, NULL);
if (FAILED_UNEXPECTEDLY(hr))
return hr;
return S_OK;
} }
STDAPI STDAPI
DllUnregisterServer(void) DllUnregisterServer(void)
{ {
return __wine_unregister_resources(netshell_hInstance); HRESULT hr;
hr = gModule.DllUnregisterServer(FALSE);
if (FAILED_UNEXPECTEDLY(hr))
return hr;
hr = gModule.UpdateRegistryFromResource(IDR_NETSHELL, FALSE, NULL);
if (FAILED_UNEXPECTEDLY(hr))
return hr;
return S_OK;
} }
STDAPI STDAPI
@ -60,12 +111,7 @@ DllGetClassObject(
REFIID riid, REFIID riid,
LPVOID *ppv) LPVOID *ppv)
{ {
if (!ppv) return gModule.DllGetClassObject(rclsid, riid, ppv);
return E_INVALIDARG;
*ppv = NULL;
return IClassFactory_fnConstructor(rclsid, riid, ppv);
} }
VOID VOID

View file

@ -23,7 +23,7 @@ IDI_NET_TRANS ICON "res/nettrans.ico"
IDI_NET_TRANSREC ICON "res/nettrrec.ico" IDI_NET_TRANSREC ICON "res/nettrrec.ico"
IDI_NET_SETUP ICON "res/netsetup.ico" IDI_NET_SETUP ICON "res/netsetup.ico"
IDR_NETSHELL WINE_REGISTRY "res/netshell.rgs" IDR_NETSHELL REGISTRY "res/netshell.rgs"
#include <reactos/manifest_dll.rc> #include <reactos/manifest_dll.rc>

View file

@ -16,22 +16,28 @@
#include <shlwapi.h> #include <shlwapi.h>
#include <shlobj.h> #include <shlobj.h>
#include <shellapi.h> #include <shellapi.h>
#include <atlbase.h>
#include <atlcom.h>
#include <atlcoll.h>
#include <atlstr.h>
#include <iphlpapi.h> #include <iphlpapi.h>
#include <setupapi.h> #include <setupapi.h>
#include <devguid.h> #include <devguid.h>
#include <netcon.h> #include <netcon.h>
#include <shlguid_undoc.h> #include <shlguid_undoc.h>
#include <prsht.h> #include <prsht.h>
#include <undocshell.h>
#include <shellutils.h>
#include <netcfgx.h>
#include <netcfgn.h>
#include <strsafe.h>
#include <wine/debug.h> #include <wine/debug.h>
WINE_DEFAULT_DEBUG_CHANNEL(shell); WINE_DEFAULT_DEBUG_CHANNEL(shell);
#include "resource.h" #include "resource.h"
#if defined(_MSC_VER) && _MSC_VER < 1700
#define final sealed
#endif
#define NCF_VIRTUAL 0x1 #define NCF_VIRTUAL 0x1
#define NCF_SOFTWARE_ENUMERATED 0x2 #define NCF_SOFTWARE_ENUMERATED 0x2
#define NCF_PHYSICAL 0x4 #define NCF_PHYSICAL 0x4
@ -43,13 +49,6 @@ WINE_DEFAULT_DEBUG_CHANNEL(shell);
#define NCF_FILTER 0x400 #define NCF_FILTER 0x400
#define NCF_NDIS_PROTOCOL 0x4000 #define NCF_NDIS_PROTOCOL 0x4000
typedef struct {
int colnameid;
int pcsFlags;
int fmt;
int cxChar;
} shvheader;
typedef struct tagVALUEStruct typedef struct tagVALUEStruct
{ {
BYTE dummy; BYTE dummy;
@ -59,32 +58,21 @@ typedef struct tagVALUEStruct
/* globals */ /* globals */
extern HINSTANCE netshell_hInstance; extern HINSTANCE netshell_hInstance;
/* shfldr_netconnect.c */
HRESULT ShowNetConnectionProperties(INetConnection * pNetConnect, HWND hwnd);
HRESULT WINAPI ISF_NetConnect_Constructor(IUnknown * pUnkOuter, REFIID riid, LPVOID * ppv);
/* enumlist.c */ /* enumlist.c */
PITEMID_CHILD _ILCreateNetConnect(void); PITEMID_CHILD _ILCreateNetConnect(void);
PITEMID_CHILD ILCreateNetConnectItem(INetConnection *pItem); PITEMID_CHILD ILCreateNetConnectItem(INetConnection *pItem);
BOOL _ILIsNetConnect(LPCITEMIDLIST pidl); BOOL _ILIsNetConnect(LPCITEMIDLIST pidl);
const VALUEStruct * _ILGetValueStruct(LPCITEMIDLIST pidl); const VALUEStruct * _ILGetValueStruct(LPCITEMIDLIST pidl);
HRESULT CEnumIDList_CreateInstance(HWND hwndOwner, DWORD dwFlags, REFIID riid, LPVOID * ppv);
/* classfactory.c */
HRESULT IClassFactory_fnConstructor(REFCLSID rclsid, REFIID riid, LPVOID *ppvOut);
/* connectmanager.c */
HRESULT WINAPI INetConnectionManager_Constructor(IUnknown *pUnkOuter, REFIID riid, LPVOID *ppv);
BOOL GetAdapterIndexFromNetCfgInstanceId(PIP_ADAPTER_INFO pAdapterInfo, LPWSTR szNetCfg, PDWORD pIndex);
/* lanconnectui.c */
HPROPSHEETPAGE InitializePropertySheetPage(LPWSTR resname, DLGPROC dlgproc, LPARAM lParam, LPWSTR szTitle);
HRESULT WINAPI LanConnectUI_Constructor(IUnknown *pUnkOuter, REFIID riid, LPVOID *ppv);
/* lanstatusui.c */
HRESULT WINAPI LanConnectStatusUI_Constructor(IUnknown *pUnkOuter, REFIID riid, LPVOID *ppv);
#define NCCF_NOTIFY_DISCONNECTED 0x100000 #define NCCF_NOTIFY_DISCONNECTED 0x100000
#include "enumlist.h" HPROPSHEETPAGE InitializePropertySheetPage(LPWSTR resname, DLGPROC dlgproc, LPARAM lParam, LPWSTR szTitle);
#include "connectmanager.h"
#include "lanconnectui.h"
#include "lanstatusui.h"
#include "shfldr_netconnect.h"
#endif /* _PRECOMP_H__ */ #endif /* _PRECOMP_H__ */

View file

@ -33,112 +33,6 @@
* IShellFolder implementation * IShellFolder implementation
*/ */
class CNetworkConnections final :
public IPersistFolder2,
public IShellExtInit,
public IShellFolder2,
public IOleCommandTarget,
public IShellFolderViewCB,
public IShellExecuteHookW
{
public:
CNetworkConnections();
/* IUnknown */
virtual HRESULT WINAPI QueryInterface(REFIID riid, LPVOID *ppvOut);
virtual ULONG WINAPI AddRef();
virtual ULONG WINAPI Release();
// IPersistFolder2
virtual HRESULT WINAPI GetClassID(CLSID *lpClassId);
virtual HRESULT WINAPI Initialize(PCIDLIST_ABSOLUTE pidl);
virtual HRESULT WINAPI GetCurFolder(PIDLIST_ABSOLUTE *pidl);
// IShellFolder
virtual HRESULT WINAPI ParseDisplayName(HWND hwndOwner, LPBC pbc, LPOLESTR lpszDisplayName, DWORD *pchEaten, PIDLIST_RELATIVE *ppidl, DWORD *pdwAttributes);
virtual HRESULT WINAPI EnumObjects(HWND hwndOwner, DWORD dwFlags, LPENUMIDLIST *ppEnumIDList);
virtual HRESULT WINAPI BindToObject(PCUIDLIST_RELATIVE pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut);
virtual HRESULT WINAPI BindToStorage(PCUIDLIST_RELATIVE pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut);
virtual HRESULT WINAPI CompareIDs(LPARAM lParam, PCUIDLIST_RELATIVE pidl1, PCUIDLIST_RELATIVE pidl2);
virtual HRESULT WINAPI CreateViewObject(HWND hwndOwner, REFIID riid, LPVOID *ppvOut);
virtual HRESULT WINAPI GetAttributesOf(UINT cidl, PCUITEMID_CHILD_ARRAY apidl, DWORD *rgfInOut);
virtual HRESULT WINAPI GetUIObjectOf(HWND hwndOwner, UINT cidl, PCUITEMID_CHILD_ARRAY apidl, REFIID riid, UINT * prgfInOut, LPVOID * ppvOut);
virtual HRESULT WINAPI GetDisplayNameOf(PCUITEMID_CHILD pidl, DWORD dwFlags, LPSTRRET strRet);
virtual HRESULT WINAPI SetNameOf(HWND hwndOwner, PCUITEMID_CHILD pidl, LPCOLESTR lpName, DWORD dwFlags, PITEMID_CHILD *pPidlOut);
// IShellFolder2
virtual HRESULT WINAPI GetDefaultSearchGUID(GUID *pguid);
virtual HRESULT WINAPI EnumSearches(IEnumExtraSearch **ppenum);
virtual HRESULT WINAPI GetDefaultColumn(DWORD dwRes, ULONG *pSort, ULONG *pDisplay);
virtual HRESULT WINAPI GetDefaultColumnState(UINT iColumn, DWORD *pcsFlags);
virtual HRESULT WINAPI GetDetailsEx(PCUITEMID_CHILD pidl, const SHCOLUMNID *pscid, VARIANT *pv);
virtual HRESULT WINAPI GetDetailsOf(PCUITEMID_CHILD pidl, UINT iColumn, SHELLDETAILS *psd);
virtual HRESULT WINAPI MapColumnToSCID(UINT column, SHCOLUMNID *pscid);
// IShellExtInit
virtual HRESULT WINAPI Initialize(PCIDLIST_ABSOLUTE pidlFolder, IDataObject *pdtobj, HKEY hkeyProgID);
// IOleCommandTarget
virtual HRESULT WINAPI Exec(const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut);
virtual HRESULT WINAPI QueryStatus(const GUID *pguidCmdGroup, ULONG cCmds, OLECMD prgCmds[], OLECMDTEXT *pCmdText);
// IShellFolderViewCB
virtual HRESULT WINAPI MessageSFVCB(UINT uMsg, WPARAM wParam, LPARAM lParam);
// IShellExecuteHookW
virtual HRESULT WINAPI Execute(LPSHELLEXECUTEINFOW pei);
private:
~CNetworkConnections();
LONG m_ref;
/* both paths are parsible from the desktop */
PIDLIST_ABSOLUTE m_pidlRoot;
IOleCommandTarget *m_lpOleCmd;
};
class CNetConUiObject final :
public IContextMenu3,
public IObjectWithSite,
public IQueryInfo,
public IExtractIconW
{
public:
CNetConUiObject(PCUITEMID_CHILD pidl, IOleCommandTarget *lpOleCmd);
// IUnknown
virtual HRESULT WINAPI QueryInterface(REFIID riid, LPVOID *ppvOut);
virtual ULONG WINAPI AddRef();
virtual ULONG WINAPI Release();
// IContextMenu3
virtual HRESULT WINAPI QueryContextMenu(HMENU hmenu, UINT indexMenu, UINT idCmdFirst, UINT idCmdLast, UINT uFlags);
virtual HRESULT WINAPI InvokeCommand(LPCMINVOKECOMMANDINFO lpici);
virtual HRESULT WINAPI GetCommandString(UINT_PTR idCmd, UINT uType, UINT *pwReserved, LPSTR pszName, UINT cchMax);
virtual HRESULT WINAPI HandleMenuMsg( UINT uMsg, WPARAM wParam, LPARAM lParam);
virtual HRESULT WINAPI HandleMenuMsg2(UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *plResult);
// IObjectWithSite
virtual HRESULT WINAPI SetSite(IUnknown *punk);
virtual HRESULT WINAPI GetSite(REFIID iid, void **ppvSite);
// IQueryInfo
virtual HRESULT WINAPI GetInfoFlags(DWORD *pdwFlags);
virtual HRESULT WINAPI GetInfoTip(DWORD dwFlags, WCHAR **ppwszTip);
// IExtractIconW
virtual HRESULT STDMETHODCALLTYPE GetIconLocation(UINT uFlags, LPWSTR szIconFile, UINT cchMax, int *piIndex, UINT *pwFlags);
virtual HRESULT STDMETHODCALLTYPE Extract(LPCWSTR pszFile, UINT nIconIndex, HICON *phiconLarge, HICON *phiconSmall, UINT nIconSize);
private:
~CNetConUiObject();
LONG m_ref;
PCUITEMID_CHILD m_pidl;
IUnknown *m_pUnknown;
IOleCommandTarget *m_lpOleCmd;
};
static const shvheader NetConnectSFHeader[] = { static const shvheader NetConnectSFHeader[] = {
{IDS_SHV_COLUMN_NAME, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_RIGHT, 20}, {IDS_SHV_COLUMN_NAME, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_RIGHT, 20},
{IDS_SHV_COLUMN_TYPE, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_RIGHT, 8}, {IDS_SHV_COLUMN_TYPE, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_RIGHT, 8},
@ -160,7 +54,6 @@ static const shvheader NetConnectSFHeader[] = {
HRESULT ShowNetConnectionStatus(IOleCommandTarget * lpOleCmd, INetConnection * pNetConnect, HWND hwnd); HRESULT ShowNetConnectionStatus(IOleCommandTarget * lpOleCmd, INetConnection * pNetConnect, HWND hwnd);
CNetworkConnections::CNetworkConnections() : CNetworkConnections::CNetworkConnections() :
m_ref(0),
m_pidlRoot(_ILCreateNetConnect()) m_pidlRoot(_ILCreateNetConnect())
{ {
HRESULT hr; HRESULT hr;
@ -179,71 +72,6 @@ CNetworkConnections::~CNetworkConnections()
SHFree(m_pidlRoot); SHFree(m_pidlRoot);
} }
/**************************************************************************
* ISF_NetConnect_fnQueryInterface
*
* NOTE
* supports not IPersist/IPersistFolder
*/
HRESULT WINAPI CNetworkConnections::QueryInterface(REFIID riid, LPVOID *ppvObj)
{
*ppvObj = NULL;
if (IsEqualIID(riid, IID_IUnknown) ||
IsEqualIID (riid, IID_IPersist) ||
IsEqualIID (riid, IID_IPersistFolder) ||
IsEqualIID (riid, IID_IPersistFolder2))
{
*ppvObj = static_cast<IPersistFolder2*>(this);
}
else if (IsEqualIID(riid, IID_IShellFolder) ||
IsEqualIID(riid, IID_IShellFolder2))
{
*ppvObj = static_cast<IShellFolder2*>(this);
}
else if (IsEqualIID(riid, IID_IShellExtInit))
{
*ppvObj = static_cast<IShellExtInit*>(this);
}
else if (IsEqualIID(riid, IID_IOleCommandTarget))
{
*ppvObj = static_cast<IOleCommandTarget*>(this);
}
else if (IsEqualIID(riid, IID_IShellFolderViewCB))
{
*ppvObj = static_cast<IShellFolderViewCB*>(this);
}
else if (IsEqualIID(riid, IID_IShellExecuteHookW))
{
*ppvObj = static_cast<IShellExecuteHookW*>(this);
}
if (*ppvObj)
{
AddRef();
return S_OK;
}
return E_NOINTERFACE;
}
ULONG WINAPI CNetworkConnections::AddRef()
{
ULONG refCount = InterlockedIncrement(&m_ref);
return refCount;
}
ULONG WINAPI CNetworkConnections::Release()
{
ULONG refCount = InterlockedDecrement(&m_ref);
if (!refCount)
delete this;
return refCount;
}
/************************************************************************** /**************************************************************************
* ISF_NetConnect_fnParseDisplayName * ISF_NetConnect_fnParseDisplayName
*/ */
@ -260,67 +88,13 @@ HRESULT WINAPI CNetworkConnections::ParseDisplayName (
return hr; return hr;
} }
/**************************************************************************
* CreateNetConnectEnumList()
*/
static BOOL CreateNetConnectEnumList(CEnumIDList *list, DWORD dwFlags)
{
HRESULT hr;
INetConnectionManager *pNetConMan;
IEnumNetConnection *pEnumCon;
INetConnection *INetCon;
ULONG Count;
PITEMID_CHILD pidl;
/* get an instance to of IConnectionManager */
hr = INetConnectionManager_Constructor(NULL, IID_INetConnectionManager, (LPVOID*)&pNetConMan);
if (FAILED(hr))
return FALSE;
hr = pNetConMan->EnumConnections(NCME_DEFAULT, &pEnumCon);
if (FAILED(hr))
{
pNetConMan->Release();
return FALSE;
}
do
{
hr = pEnumCon->Next(1, &INetCon, &Count);
if (hr == S_OK)
{
pidl = ILCreateNetConnectItem(INetCon);
if (pidl)
{
list->AddToEnumList(pidl);
}
}
else
{
break;
}
} while (TRUE);
pEnumCon->Release();
pNetConMan->Release();
return TRUE;
}
/************************************************************************** /**************************************************************************
* ISF_NetConnect_fnEnumObjects * ISF_NetConnect_fnEnumObjects
*/ */
HRESULT WINAPI CNetworkConnections::EnumObjects( HRESULT WINAPI CNetworkConnections::EnumObjects(
HWND hwndOwner, DWORD dwFlags, LPENUMIDLIST *ppEnumIDList) HWND hwndOwner, DWORD dwFlags, LPENUMIDLIST *ppEnumIDList)
{ {
CEnumIDList *pList = new CEnumIDList; return CEnumIDList_CreateInstance(hwndOwner, dwFlags, IID_PPV_ARG(IEnumIDList, ppEnumIDList));
*ppEnumIDList = static_cast<LPENUMIDLIST>(pList);
if (!pList)
return E_OUTOFMEMORY;
pList->AddRef();
CreateNetConnectEnumList(pList, dwFlags);
return S_OK;
} }
/************************************************************************** /**************************************************************************
@ -454,18 +228,6 @@ HRESULT WINAPI CNetworkConnections::GetAttributesOf(
* *
*/ */
HRESULT IContextMenuImpl_Constructor(REFIID riid, PCUITEMID_CHILD pidl, LPVOID * ppvOut, IOleCommandTarget * lpOleCmd)
{
CNetConUiObject *pMenu = new CNetConUiObject(pidl, lpOleCmd);
if (!pMenu)
return E_OUTOFMEMORY;
pMenu->AddRef();
HRESULT hr = pMenu->QueryInterface(riid, ppvOut);
pMenu->Release();
return hr;
}
HRESULT WINAPI CNetworkConnections::GetUIObjectOf( HRESULT WINAPI CNetworkConnections::GetUIObjectOf(
HWND hwndOwner, UINT cidl, PCUITEMID_CHILD_ARRAY apidl, REFIID riid, HWND hwndOwner, UINT cidl, PCUITEMID_CHILD_ARRAY apidl, REFIID riid,
UINT * prgfInOut, LPVOID * ppvOut) UINT * prgfInOut, LPVOID * ppvOut)
@ -481,7 +243,7 @@ HRESULT WINAPI CNetworkConnections::GetUIObjectOf(
if ((IsEqualIID(riid, IID_IContextMenu) || IsEqualIID (riid, IID_IContextMenu2) || IsEqualIID(riid, IID_IContextMenu3) || if ((IsEqualIID(riid, IID_IContextMenu) || IsEqualIID (riid, IID_IContextMenu2) || IsEqualIID(riid, IID_IContextMenu3) ||
IsEqualIID(riid, IID_IQueryInfo) || IsEqualIID(riid, IID_IExtractIconW)) && cidl >= 1) IsEqualIID(riid, IID_IQueryInfo) || IsEqualIID(riid, IID_IExtractIconW)) && cidl >= 1)
{ {
return IContextMenuImpl_Constructor(riid, apidl[0], ppvOut, m_lpOleCmd); return ShellObjectCreatorInit<CNetConUiObject>(apidl[0], m_lpOleCmd, riid, ppvOut);
} }
else else
hr = E_NOINTERFACE; hr = E_NOINTERFACE;
@ -725,14 +487,11 @@ HRESULT WINAPI CNetworkConnections::MapColumnToSCID(UINT column, SHCOLUMNID *psc
* IContextMenu2 Implementation * IContextMenu2 Implementation
*/ */
CNetConUiObject::CNetConUiObject(PCUITEMID_CHILD pidl, IOleCommandTarget *lpOleCmd) CNetConUiObject::CNetConUiObject()
: m_ref(0), : m_pidl(NULL),
m_pidl(pidl),
m_pUnknown(NULL), m_pUnknown(NULL),
m_lpOleCmd(lpOleCmd) m_lpOleCmd(NULL)
{ {
if (m_lpOleCmd)
m_lpOleCmd->AddRef();
} }
CNetConUiObject::~CNetConUiObject() CNetConUiObject::~CNetConUiObject()
@ -741,55 +500,13 @@ CNetConUiObject::~CNetConUiObject()
m_lpOleCmd->Release(); m_lpOleCmd->Release();
} }
/************************************************************************ HRESULT WINAPI CNetConUiObject::Initialize(PCUITEMID_CHILD pidl, IOleCommandTarget *lpOleCmd)
* ISF_NetConnect_IContextMenu_QueryInterface
*/
HRESULT WINAPI CNetConUiObject::QueryInterface(REFIID iid, LPVOID *ppvObject)
{ {
*ppvObject = NULL; m_pidl = pidl;
m_lpOleCmd = lpOleCmd;
if (IsEqualIID(iid, IID_IContextMenu) || IsEqualIID(iid, IID_IContextMenu2) || IsEqualIID(iid, IID_IContextMenu3)) if (m_lpOleCmd)
*ppvObject = static_cast<IContextMenu3*>(this); m_lpOleCmd->AddRef();
else if (IsEqualIID(iid, IID_IObjectWithSite)) return S_OK;
*ppvObject = static_cast<IObjectWithSite*>(this);
else if (IsEqualIID(iid, IID_IQueryInfo))
*ppvObject = static_cast<IQueryInfo*>(this);
else if (IsEqualIID(iid, IID_IExtractIconW))
*ppvObject = static_cast<IExtractIconW*>(this);
if (*ppvObject)
{
AddRef();
return S_OK;
}
return E_NOINTERFACE;
}
/************************************************************************
* ISF_NetConnect_IContextMenu_AddRef
*/
ULONG WINAPI CNetConUiObject::AddRef()
{
ULONG refCount;
refCount = InterlockedIncrement(&m_ref);
return refCount;
}
/************************************************************************
* ISF_NetConnect_IContextMenu_Release
*/
ULONG WINAPI CNetConUiObject::Release()
{
ULONG refCount;
refCount = InterlockedDecrement(&m_ref);
if (!refCount)
delete this;
return refCount;
} }
void WINAPI _InsertMenuItemW ( void WINAPI _InsertMenuItemW (
@ -1294,26 +1011,3 @@ HRESULT WINAPI CNetConUiObject::GetInfoTip(DWORD dwFlags, WCHAR **ppwszTip)
*ppwszTip = NULL; *ppwszTip = NULL;
return S_OK; return S_OK;
} }
/**************************************************************************
* ISF_NetConnect_Constructor
*/
HRESULT WINAPI ISF_NetConnect_Constructor(IUnknown *pUnkOuter, REFIID riid, LPVOID *ppv)
{
TRACE("ISF_NetConnect_Constructor\n");
if (!ppv)
return E_POINTER;
if (pUnkOuter)
return CLASS_E_NOAGGREGATION;
CNetworkConnections *pnc = new CNetworkConnections;
if (!pnc)
return E_OUTOFMEMORY;
pnc->AddRef();
HRESULT hr = pnc->QueryInterface(riid, ppv);
pnc->Release();
return hr;
}

View file

@ -0,0 +1,137 @@
typedef struct {
int colnameid;
int pcsFlags;
int fmt;
int cxChar;
} shvheader;
class CNetworkConnections:
public CComCoClass<CNetworkConnections, &CLSID_ConnectionFolder>,
public CComObjectRootEx<CComMultiThreadModelNoCS>,
public IPersistFolder2,
public IShellExtInit,
public IShellFolder2,
public IOleCommandTarget,
public IShellFolderViewCB,
public IShellExecuteHookW
{
public:
CNetworkConnections();
~CNetworkConnections();
// IPersistFolder2
virtual HRESULT WINAPI GetClassID(CLSID *lpClassId);
virtual HRESULT WINAPI Initialize(PCIDLIST_ABSOLUTE pidl);
virtual HRESULT WINAPI GetCurFolder(PIDLIST_ABSOLUTE *pidl);
// IShellFolder
virtual HRESULT WINAPI ParseDisplayName(HWND hwndOwner, LPBC pbc, LPOLESTR lpszDisplayName, DWORD *pchEaten, PIDLIST_RELATIVE *ppidl, DWORD *pdwAttributes);
virtual HRESULT WINAPI EnumObjects(HWND hwndOwner, DWORD dwFlags, LPENUMIDLIST *ppEnumIDList);
virtual HRESULT WINAPI BindToObject(PCUIDLIST_RELATIVE pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut);
virtual HRESULT WINAPI BindToStorage(PCUIDLIST_RELATIVE pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut);
virtual HRESULT WINAPI CompareIDs(LPARAM lParam, PCUIDLIST_RELATIVE pidl1, PCUIDLIST_RELATIVE pidl2);
virtual HRESULT WINAPI CreateViewObject(HWND hwndOwner, REFIID riid, LPVOID *ppvOut);
virtual HRESULT WINAPI GetAttributesOf(UINT cidl, PCUITEMID_CHILD_ARRAY apidl, DWORD *rgfInOut);
virtual HRESULT WINAPI GetUIObjectOf(HWND hwndOwner, UINT cidl, PCUITEMID_CHILD_ARRAY apidl, REFIID riid, UINT * prgfInOut, LPVOID * ppvOut);
virtual HRESULT WINAPI GetDisplayNameOf(PCUITEMID_CHILD pidl, DWORD dwFlags, LPSTRRET strRet);
virtual HRESULT WINAPI SetNameOf(HWND hwndOwner, PCUITEMID_CHILD pidl, LPCOLESTR lpName, DWORD dwFlags, PITEMID_CHILD *pPidlOut);
// IShellFolder2
virtual HRESULT WINAPI GetDefaultSearchGUID(GUID *pguid);
virtual HRESULT WINAPI EnumSearches(IEnumExtraSearch **ppenum);
virtual HRESULT WINAPI GetDefaultColumn(DWORD dwRes, ULONG *pSort, ULONG *pDisplay);
virtual HRESULT WINAPI GetDefaultColumnState(UINT iColumn, DWORD *pcsFlags);
virtual HRESULT WINAPI GetDetailsEx(PCUITEMID_CHILD pidl, const SHCOLUMNID *pscid, VARIANT *pv);
virtual HRESULT WINAPI GetDetailsOf(PCUITEMID_CHILD pidl, UINT iColumn, SHELLDETAILS *psd);
virtual HRESULT WINAPI MapColumnToSCID(UINT column, SHCOLUMNID *pscid);
// IShellExtInit
virtual HRESULT WINAPI Initialize(PCIDLIST_ABSOLUTE pidlFolder, IDataObject *pdtobj, HKEY hkeyProgID);
// IOleCommandTarget
virtual HRESULT WINAPI Exec(const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut);
virtual HRESULT WINAPI QueryStatus(const GUID *pguidCmdGroup, ULONG cCmds, OLECMD prgCmds[], OLECMDTEXT *pCmdText);
// IShellFolderViewCB
virtual HRESULT WINAPI MessageSFVCB(UINT uMsg, WPARAM wParam, LPARAM lParam);
// IShellExecuteHookW
virtual HRESULT WINAPI Execute(LPSHELLEXECUTEINFOW pei);
private:
/* both paths are parsible from the desktop */
PIDLIST_ABSOLUTE m_pidlRoot;
IOleCommandTarget *m_lpOleCmd;
public:
BEGIN_COM_MAP(CNetworkConnections)
COM_INTERFACE_ENTRY_IID(IID_IPersist, IPersistFolder2)
COM_INTERFACE_ENTRY_IID(IID_IPersistFolder, IPersistFolder2)
COM_INTERFACE_ENTRY_IID(IID_IPersistFolder2, IPersistFolder2)
COM_INTERFACE_ENTRY_IID(IID_IShellFolder, IShellFolder2)
COM_INTERFACE_ENTRY_IID(IID_IShellFolder2, IShellFolder2)
COM_INTERFACE_ENTRY_IID(IID_IShellExtInit, IShellExtInit)
COM_INTERFACE_ENTRY_IID(IID_IOleCommandTarget, IOleCommandTarget)
COM_INTERFACE_ENTRY_IID(IID_IShellFolderViewCB, IShellFolderViewCB)
COM_INTERFACE_ENTRY_IID(IID_IShellExecuteHookW, IShellExecuteHookW)
END_COM_MAP()
DECLARE_NO_REGISTRY()
DECLARE_NOT_AGGREGATABLE(CNetworkConnections)
DECLARE_PROTECT_FINAL_CONSTRUCT()
};
class CNetConUiObject:
public CComObjectRootEx<CComMultiThreadModelNoCS>,
public IContextMenu3,
public IObjectWithSite,
public IQueryInfo,
public IExtractIconW
{
private:
PCUITEMID_CHILD m_pidl;
IUnknown *m_pUnknown;
IOleCommandTarget *m_lpOleCmd;
public:
CNetConUiObject();
~CNetConUiObject();
HRESULT WINAPI Initialize(PCUITEMID_CHILD pidl, IOleCommandTarget *lpOleCmd);
// IContextMenu3
virtual HRESULT WINAPI QueryContextMenu(HMENU hmenu, UINT indexMenu, UINT idCmdFirst, UINT idCmdLast, UINT uFlags);
virtual HRESULT WINAPI InvokeCommand(LPCMINVOKECOMMANDINFO lpici);
virtual HRESULT WINAPI GetCommandString(UINT_PTR idCmd, UINT uType, UINT *pwReserved, LPSTR pszName, UINT cchMax);
virtual HRESULT WINAPI HandleMenuMsg( UINT uMsg, WPARAM wParam, LPARAM lParam);
virtual HRESULT WINAPI HandleMenuMsg2(UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *plResult);
// IObjectWithSite
virtual HRESULT WINAPI SetSite(IUnknown *punk);
virtual HRESULT WINAPI GetSite(REFIID iid, void **ppvSite);
// IQueryInfo
virtual HRESULT WINAPI GetInfoFlags(DWORD *pdwFlags);
virtual HRESULT WINAPI GetInfoTip(DWORD dwFlags, WCHAR **ppwszTip);
// IExtractIconW
virtual HRESULT STDMETHODCALLTYPE GetIconLocation(UINT uFlags, LPWSTR szIconFile, UINT cchMax, int *piIndex, UINT *pwFlags);
virtual HRESULT STDMETHODCALLTYPE Extract(LPCWSTR pszFile, UINT nIconIndex, HICON *phiconLarge, HICON *phiconSmall, UINT nIconSize);
BEGIN_COM_MAP(CNetConUiObject)
COM_INTERFACE_ENTRY_IID(IID_IContextMenu, IContextMenu3)
COM_INTERFACE_ENTRY_IID(IID_IContextMenu2, IContextMenu3)
COM_INTERFACE_ENTRY_IID(IID_IContextMenu3, IContextMenu3)
COM_INTERFACE_ENTRY_IID(IID_IObjectWithSite, IObjectWithSite)
COM_INTERFACE_ENTRY_IID(IID_IQueryInfo, IQueryInfo)
COM_INTERFACE_ENTRY_IID(IID_IExtractIconW, IExtractIconW)
END_COM_MAP()
DECLARE_NOT_AGGREGATABLE(CNetConUiObject)
DECLARE_PROTECT_FINAL_CONSTRUCT()
};
HRESULT ShowNetConnectionProperties(INetConnection * pNetConnect, HWND hwnd);