[NETSHELL] Use ATL
authorGiannis Adamopoulos <gadamopoulos@reactos.org>
Mon, 12 Nov 2018 11:23:38 +0000 (13:23 +0200)
committerGiannis Adamopoulos <gadamopoulos@reactos.org>
Sun, 18 Nov 2018 12:01:54 +0000 (14:01 +0200)
15 files changed:
dll/shellext/netshell/CMakeLists.txt
dll/shellext/netshell/classfactory.cpp [deleted file]
dll/shellext/netshell/connectmanager.cpp
dll/shellext/netshell/connectmanager.h [new file with mode: 0644]
dll/shellext/netshell/enumlist.cpp
dll/shellext/netshell/enumlist.h [deleted file]
dll/shellext/netshell/lanconnectui.cpp
dll/shellext/netshell/lanconnectui.h [new file with mode: 0644]
dll/shellext/netshell/lanstatusui.cpp
dll/shellext/netshell/lanstatusui.h [new file with mode: 0644]
dll/shellext/netshell/netshell.cpp
dll/shellext/netshell/netshell.rc
dll/shellext/netshell/precomp.h
dll/shellext/netshell/shfldr_netconnect.cpp
dll/shellext/netshell/shfldr_netconnect.h [new file with mode: 0644]

index 3a5f4a5..cff3ce2 100644 (file)
@@ -11,6 +11,11 @@ endif()
 remove_definitions(-D_WIN32_WINNT=0x502)
 add_definitions(-D_WIN32_WINNT=0x600)
 
+add_definitions(
+    -D_ATL_NO_EXCEPTIONS)
+
+include_directories(${REACTOS_SOURCE_DIR}/sdk/lib/atl)
+
 add_definitions(-D_NETSHELL_)
 spec2def(netshell.dll netshell.spec)
 
@@ -18,7 +23,6 @@ list(APPEND SOURCE
     netshell.cpp
     shfldr_netconnect.cpp
     enumlist.cpp
-    classfactory.cpp
     connectmanager.cpp
     lanconnectui.cpp
     lanstatusui.cpp
@@ -34,8 +38,9 @@ add_library(netshell SHARED
     ${CMAKE_CURRENT_BINARY_DIR}/netshell_stubs.c
     ${CMAKE_CURRENT_BINARY_DIR}/netshell.def)
 
-set_module_type(netshell win32dll)
-target_link_libraries(netshell uuid wine)
-add_importlibs(netshell shlwapi shell32 version iphlpapi ole32 gdi32 user32 advapi32 setupapi ws2_32 comctl32 msvcrt kernel32 ntdll)
+set_module_type(netshell win32dll UNICODE)
+target_link_libraries(netshell atlnew uuid wine)
+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_cd_file(TARGET netshell DESTINATION reactos/system32 FOR all)
diff --git a/dll/shellext/netshell/classfactory.cpp b/dll/shellext/netshell/classfactory.cpp
deleted file mode 100644 (file)
index 1e4d5fe..0000000
+++ /dev/null
@@ -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;
-}
index f71d58f..88780be 100644 (file)
 
 #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);
 
-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
  */
 
-CNetConnection::CNetConnection(PINetConnectionItem pItem) :
-    m_ref(0),
-    m_Props(pItem->Props),
-    m_dwAdapterIndex(pItem->dwAdapterIndex)
+HRESULT
+WINAPI
+CNetConnection::Initialize(PINetConnectionItem pItem)
 {
+    m_Props = pItem->Props;
+    m_dwAdapterIndex = pItem->dwAdapterIndex;
+
     if (pItem->Props.pszwName)
     {
         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)
             wcscpy(m_Props.pszwDeviceName, pItem->Props.pszwDeviceName);
     }
+
+    return S_OK;
 }
 
 CNetConnection::~CNetConnection()
@@ -168,46 +43,6 @@ CNetConnection::~CNetConnection()
     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
 WINAPI
 CNetConnection::Connect()
@@ -390,21 +225,37 @@ CNetConnection::Rename(LPCWSTR pszwDuplicateName)
     return hr;
 }
 
-HRESULT WINAPI IConnection_Constructor(INetConnection **ppv, PINetConnectionItem pItem)
+HRESULT WINAPI CNetConnection_CreateInstance(PINetConnectionItem pItem, REFIID riid, LPVOID * ppv)
 {
-    if (!ppv)
-        return E_POINTER;
+    return ShellObjectCreatorInit<CNetConnection>(pItem, riid, ppv);
+}
 
-    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
@@ -428,7 +279,7 @@ CNetConnectionManager::Next(
     if (!m_pCurrent)
         return S_FALSE;
 
-    hr = IConnection_Constructor(rgelt, m_pCurrent);
+    hr = CNetConnection_CreateInstance(m_pCurrent, IID_PPV_ARG(INetConnection, rgelt));
     m_pCurrent = m_pCurrent->Next;
 
     return hr;
@@ -517,7 +368,7 @@ NormalizeOperStatus(
     }
 }
 
-BOOL
+HRESULT
 CNetConnectionManager::EnumerateINetConnections()
 {
     DWORD dwSize, dwResult, dwIndex, dwAdapterIndex, dwShowIcon, dwNotifyDisconnect;
@@ -536,17 +387,17 @@ CNetConnectionManager::EnumerateINetConnections()
     /* get the IfTable */
     dwSize = 0;
     if (GetIfTable(NULL, &dwSize, TRUE) != ERROR_INSUFFICIENT_BUFFER)
-        return FALSE;
+        return E_FAIL;
 
     pIfTable = static_cast<PMIB_IFTABLE>(CoTaskMemAlloc(dwSize));
     if (!pIfTable)
-        return FALSE;
+        return E_OUTOFMEMORY;
 
     dwResult = GetIfTable(pIfTable, &dwSize, TRUE);
     if (dwResult != NO_ERROR)
     {
         CoTaskMemFree(pIfTable);
-        return FALSE;
+        return HRESULT_FROM_WIN32(dwResult);
     }
 
     dwSize = 0;
@@ -554,21 +405,22 @@ CNetConnectionManager::EnumerateINetConnections()
     if (dwResult!= ERROR_BUFFER_OVERFLOW)
     {
         CoTaskMemFree(pIfTable);
-        return FALSE;
+        return HRESULT_FROM_WIN32(dwResult);
     }
 
     pAdapterInfo = static_cast<PIP_ADAPTER_INFO>(CoTaskMemAlloc(dwSize));
     if (!pAdapterInfo)
     {
         CoTaskMemFree(pIfTable);
-        return FALSE;
+        return E_OUTOFMEMORY;
     }
 
-    if (GetAdaptersInfo(pAdapterInfo, &dwSize) != NO_ERROR)
+    dwResult = GetAdaptersInfo(pAdapterInfo, &dwSize);
+    if (dwResult != NO_ERROR)
     {
         CoTaskMemFree(pIfTable);
         CoTaskMemFree(pAdapterInfo);
-        return FALSE;
+        return HRESULT_FROM_WIN32(dwResult);
     }
 
     hInfo = SetupDiGetClassDevs(&GUID_DEVCLASS_NET, NULL, NULL, DIGCF_PRESENT );
@@ -576,7 +428,7 @@ CNetConnectionManager::EnumerateINetConnections()
     {
         CoTaskMemFree(pIfTable);
         CoTaskMemFree(pAdapterInfo);
-        return FALSE;
+        return E_FAIL;
     }
 
     dwIndex = 0;
@@ -690,31 +542,22 @@ CNetConnectionManager::EnumerateINetConnections()
     SetupDiDestroyDeviceInfoList(hInfo);
 
     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");
-
-    if (!ppv)
-        return E_POINTER;
-    if (pUnkOuter)
-        return CLASS_E_NOAGGREGATION;
-
-    CNetConnectionManager *pConnectionMgr = new CNetConnectionManager;
-    if (!pConnectionMgr)
-        return E_OUTOFMEMORY;
-
-    pConnectionMgr->AddRef();
-    HRESULT hr = pConnectionMgr->QueryInterface(riid, ppv);
-
-    if (SUCCEEDED(hr))
-        pConnectionMgr->EnumerateINetConnections();
-
-    pConnectionMgr->Release();
-
-    return hr;
+    HRESULT hr = EnumerateINetConnections();
+    if (FAILED_UNEXPECTEDLY(hr))
+    {
+        /* If something went wrong during the enumeration print an error don't enumerate anything */
+        m_pCurrent = m_pHead = NULL;
+        return S_FALSE;
+    }
+    return S_OK;
 }
 
-
+HRESULT WINAPI CNetConnectionManager_CreateInstance(REFIID riid, LPVOID * ppv)
+{
+    return ShellObjectCreatorInit<CNetConnectionManager>(riid, ppv);
+}
diff --git a/dll/shellext/netshell/connectmanager.h b/dll/shellext/netshell/connectmanager.h
new file mode 100644 (file)
index 0000000..a4a8329
--- /dev/null
@@ -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);
+
index 9dc629c..c4e5de3 100644 (file)
@@ -7,6 +7,63 @@
 
 #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()
  */
@@ -44,7 +101,6 @@ CEnumIDList::AddToEnumList(PITEMID_CHILD pidl)
 }
 
 CEnumIDList::CEnumIDList() :
-    m_ref(0),
     m_pFirst(NULL),
     m_pLast(NULL),
     m_pCurrent(NULL)
@@ -65,41 +121,48 @@ CEnumIDList::~CEnumIDList()
 }
 
 HRESULT
-WINAPI
-CEnumIDList::QueryInterface(
-    REFIID riid,
-    LPVOID *ppvObj)
+CEnumIDList::Initialize()
 {
-    *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);
-        AddRef();
+        pNetConMan->Release();
         return S_OK;
     }
 
-    return E_NOINTERFACE;
-}
-
-ULONG
-WINAPI
-CEnumIDList::AddRef()
-{
-    ULONG refCount = InterlockedIncrement(&m_ref);
-
-    return refCount;
-}
-
-ULONG
-WINAPI CEnumIDList::Release()
-{
-    ULONG refCount = InterlockedDecrement(&m_ref);
+    do
+    {
+        hr = pEnumCon->Next(1, &INetCon, &Count);
+        if (hr == S_OK)
+        {
+            pidl = ILCreateNetConnectItem(INetCon);
+            if (pidl)
+            {
+                AddToEnumList(pidl);
+            }
+        }
+        else
+        {
+            break;
+        }
+    } while (TRUE);
 
-    if (!refCount)
-        delete this;
+    pEnumCon->Release();
+    pNetConMan->Release();
 
-    return refCount;
+    return S_OK;    
 }
 
 HRESULT
@@ -264,3 +327,8 @@ const VALUEStruct * _ILGetValueStruct(LPCITEMIDLIST pidl)
 
     return NULL;
 }
+
+HRESULT CEnumIDList_CreateInstance(HWND hwndOwner, DWORD dwFlags, REFIID riid, LPVOID * ppv)
+{
+    return ShellObjectCreatorInit<CEnumIDList>(riid, ppv);
+}
diff --git a/dll/shellext/netshell/enumlist.h b/dll/shellext/netshell/enumlist.h
deleted file mode 100644 (file)
index a693e1e..0000000
+++ /dev/null
@@ -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;
-};
index 4722b91..60e25f0 100644 (file)
@@ -7,78 +7,11 @@
 
 #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() :
     m_pCon(NULL),
     m_NCfgLock(NULL),
     m_pNCfg(NULL),
-    m_pProperties(NULL),
-    m_ref(0)
+    m_pProperties(NULL)
 {
 }
 
@@ -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
 AddItemToListView(HWND hDlgCtrl, PNET_ITEM pItem, LPWSTR szName, BOOL bChecked)
 {
@@ -528,59 +441,6 @@ CNetConnectionPropertyUi::GetDeviceInstanceID(
     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
 WINAPI
 CNetConnectionPropertyUi::AddPages(
@@ -679,24 +539,3 @@ CNetConnectionPropertyUi::Disconnect(
 
     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;
-}
diff --git a/dll/shellext/netshell/lanconnectui.h b/dll/shellext/netshell/lanconnectui.h
new file mode 100644 (file)
index 0000000..02c8a80
--- /dev/null
@@ -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()
+};
index 19e3bec..2aa7cc0 100644 (file)
@@ -9,65 +9,8 @@
 
 #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() :
     m_lpNetMan(NULL),
-    m_ref(0),
     m_pHead(NULL)
 {
 }
@@ -1002,10 +945,10 @@ CLanStatus::InitializeNetTaskbarNotifications()
 
     //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))
     {
-        ERR("INetConnectionManager_Constructor failed\n");
+        ERR("CNetConnectionManager_CreateInstance failed\n");
         return hr;
     }
 
@@ -1124,46 +1067,6 @@ CLanStatus::ShowStatusDialogByCLSID(const GUID *pguidCmdGroup)
     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
 WINAPI
 CLanStatus::QueryStatus(
@@ -1199,26 +1102,3 @@ CLanStatus::Exec(
     }
     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);
-}
-
diff --git a/dll/shellext/netshell/lanstatusui.h b/dll/shellext/netshell/lanstatusui.h
new file mode 100644 (file)
index 0000000..62f047b
--- /dev/null
@@ -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()
+
+};
index 0aaab32..17ef8e7 100644 (file)
@@ -7,16 +7,46 @@
 
 #include "precomp.h"
 
-#include <olectl.h>
+HMODULE g_hModule = NULL;
 
 HINSTANCE netshell_hInstance;
 
-extern "C"
+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;
 
-/* FIXME: rpcproxy.h */
-HRESULT __wine_register_resources(HMODULE module);
-HRESULT __wine_unregister_resources(HMODULE module);
+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"
+{
 
 BOOL
 WINAPI
@@ -27,6 +57,7 @@ DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID fImpLoad)
         case DLL_PROCESS_ATTACH:
             netshell_hInstance = hinstDLL;
             DisableThreadLibraryCalls(netshell_hInstance);
+            gModule.Init(ObjectMap, netshell_hInstance, NULL);
             break;
     default:
         break;
@@ -45,13 +76,33 @@ DllCanUnloadNow(void)
 STDAPI
 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
 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
@@ -60,12 +111,7 @@ DllGetClassObject(
   REFIID riid,
   LPVOID *ppv)
 {
-    if (!ppv)
-        return E_INVALIDARG;
-
-    *ppv = NULL;
-
-    return IClassFactory_fnConstructor(rclsid, riid, ppv);
+    return gModule.DllGetClassObject(rclsid, riid, ppv);
 }
 
 VOID
index 363273c..b0c9625 100644 (file)
@@ -23,7 +23,7 @@ IDI_NET_TRANS ICON "res/nettrans.ico"
 IDI_NET_TRANSREC ICON "res/nettrrec.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>
 
index 0d763a1..a9553dc 100644 (file)
 #include <shlwapi.h>
 #include <shlobj.h>
 #include <shellapi.h>
+#include <atlbase.h>
+#include <atlcom.h>
+#include <atlcoll.h>
+#include <atlstr.h>
 #include <iphlpapi.h>
 #include <setupapi.h>
 #include <devguid.h>
 #include <netcon.h>
 #include <shlguid_undoc.h>
 #include <prsht.h>
+#include <undocshell.h>
+#include <shellutils.h>
+
+#include <netcfgx.h>
+#include <netcfgn.h>
+#include <strsafe.h>
 
 #include <wine/debug.h>
 WINE_DEFAULT_DEBUG_CHANNEL(shell);
 
 #include "resource.h"
 
-#if defined(_MSC_VER) && _MSC_VER < 1700
-#define final sealed
-#endif
-
 #define NCF_VIRTUAL                     0x1
 #define NCF_SOFTWARE_ENUMERATED         0x2
 #define NCF_PHYSICAL                    0x4
@@ -43,13 +49,6 @@ WINE_DEFAULT_DEBUG_CHANNEL(shell);
 #define NCF_FILTER                      0x400
 #define NCF_NDIS_PROTOCOL               0x4000
 
-typedef struct {
-    int colnameid;
-    int pcsFlags;
-    int fmt;
-    int cxChar;
-} shvheader;
-
 typedef struct tagVALUEStruct
 {
     BYTE dummy;
@@ -59,32 +58,21 @@ typedef struct tagVALUEStruct
 /* globals */
 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 */
 PITEMID_CHILD _ILCreateNetConnect(void);
 PITEMID_CHILD ILCreateNetConnectItem(INetConnection *pItem);
 BOOL _ILIsNetConnect(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);
+#define NCCF_NOTIFY_DISCONNECTED 0x100000
 
-/* 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
+#include "connectmanager.h"
+#include "lanconnectui.h"
+#include "lanstatusui.h"
+#include "shfldr_netconnect.h"
 
-#include "enumlist.h"
 
 #endif /* _PRECOMP_H__ */
index 91e1202..82d0cfa 100644 (file)
 *   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[] = {
     {IDS_SHV_COLUMN_NAME, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_RIGHT, 20},
     {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);
 
 CNetworkConnections::CNetworkConnections() :
-    m_ref(0),
     m_pidlRoot(_ILCreateNetConnect())
 {
     HRESULT hr;
@@ -179,71 +72,6 @@ CNetworkConnections::~CNetworkConnections()
     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
 */
@@ -260,67 +88,13 @@ HRESULT WINAPI CNetworkConnections::ParseDisplayName (
     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
 */
 HRESULT WINAPI CNetworkConnections::EnumObjects(
                HWND hwndOwner, DWORD dwFlags, LPENUMIDLIST *ppEnumIDList)
 {
-    CEnumIDList *pList = new CEnumIDList;
-    *ppEnumIDList = static_cast<LPENUMIDLIST>(pList);
-    if (!pList)
-        return E_OUTOFMEMORY;
-
-    pList->AddRef();
-    CreateNetConnectEnumList(pList, dwFlags);
-    return S_OK;
+    return CEnumIDList_CreateInstance(hwndOwner, dwFlags, IID_PPV_ARG(IEnumIDList, ppEnumIDList));
 }
 
 /**************************************************************************
@@ -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(
                HWND hwndOwner, UINT cidl, PCUITEMID_CHILD_ARRAY apidl, REFIID riid,
                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) ||
          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
         hr = E_NOINTERFACE;
@@ -725,14 +487,11 @@ HRESULT WINAPI CNetworkConnections::MapColumnToSCID(UINT column, SHCOLUMNID *psc
 * IContextMenu2 Implementation
 */
 
-CNetConUiObject::CNetConUiObject(PCUITEMID_CHILD pidl, IOleCommandTarget *lpOleCmd)
-    : m_ref(0),
-      m_pidl(pidl),
+CNetConUiObject::CNetConUiObject()
+    : m_pidl(NULL),
       m_pUnknown(NULL),
-      m_lpOleCmd(lpOleCmd)
+      m_lpOleCmd(NULL)
 {
-    if (m_lpOleCmd)
-        m_lpOleCmd->AddRef();
 }
 
 CNetConUiObject::~CNetConUiObject()
@@ -741,55 +500,13 @@ CNetConUiObject::~CNetConUiObject()
         m_lpOleCmd->Release();
 }
 
-/************************************************************************
- * ISF_NetConnect_IContextMenu_QueryInterface
- */
-HRESULT WINAPI CNetConUiObject::QueryInterface(REFIID iid, LPVOID *ppvObject)
-{
-    *ppvObject = NULL;
-
-    if (IsEqualIID(iid, IID_IContextMenu) || IsEqualIID(iid, IID_IContextMenu2) || IsEqualIID(iid, IID_IContextMenu3))
-        *ppvObject = static_cast<IContextMenu3*>(this);
-    else if (IsEqualIID(iid, IID_IObjectWithSite))
-        *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()
+HRESULT WINAPI CNetConUiObject::Initialize(PCUITEMID_CHILD pidl, IOleCommandTarget *lpOleCmd)
 {
-    ULONG refCount;
-
-    refCount = InterlockedDecrement(&m_ref);
-    if (!refCount)
-        delete this;
-
-    return refCount;
+    m_pidl = pidl;
+    m_lpOleCmd = lpOleCmd;
+    if (m_lpOleCmd)
+        m_lpOleCmd->AddRef();
+    return S_OK;
 }
 
 void WINAPI _InsertMenuItemW (
@@ -1294,26 +1011,3 @@ HRESULT WINAPI CNetConUiObject::GetInfoTip(DWORD dwFlags, WCHAR **ppwszTip)
     *ppwszTip = NULL;
     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;
-}
diff --git a/dll/shellext/netshell/shfldr_netconnect.h b/dll/shellext/netshell/shfldr_netconnect.h
new file mode 100644 (file)
index 0000000..2c541ad
--- /dev/null
@@ -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);