Quantcast
Channel: CodeGuru Forums - Visual C++ Programming
Viewing all articles
Browse latest Browse all 3046

Shell (Namespace) Extension won't register, what am I doing wrong?

$
0
0
Hi,

I have created a Namespace Extension (I hope so) by creating a ATL Project with MFC support as dll in Visual Studio 2010.

Now I have a Implementation of IShellFolder:

Code:

// ILCShellFolder.h: Deklaration von CILCShellFolder

#pragma once
#include "resource.h"      // Hauptsymbole



#include "NewNSE_i.h"



#if defined(_WIN32_WCE) && !defined(_CE_DCOM) && !defined(_CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTA)
#error "Singlethread-COM-Objekte werden auf der Windows CE-Plattform nicht vollständig unterstützt. Windows Mobile-Plattformen bieten beispielsweise keine vollständige DCOM-Unterstützung. Definieren Sie _CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTA, um ATL zu zwingen, die Erstellung von Singlethread-COM-Objekten zu unterstützen und die Verwendung eigener Singlethread-COM-Objektimplementierungen zu erlauben. Das Threadmodell in der RGS-Datei wurde auf 'Free' festgelegt, da dies das einzige Threadmodell ist, das auf Windows CE-Plattformen ohne DCOM unterstützt wird."
#endif

using namespace ATL;


// CILCShellFolder

class ATL_NO_VTABLE CILCShellFolder :
        public CComObjectRootEx<CComSingleThreadModel>,
        public CComCoClass<CILCShellFolder, &CLSID_ILCShellFolder>,
        //public IDispatchImpl<IILCShellFolder, &IID_IILCShellFolder, &LIBID_NewNSELib, /*wMajor =*/ 1, /*wMinor =*/ 0>,
        public IShellFolder,
        public IPersistFolder
{
public:
        CILCShellFolder(){
        }

DECLARE_REGISTRY_RESOURCEID(IDR_ILCSHELLFOLDER)


BEGIN_COM_MAP(CILCShellFolder)
        //COM_INTERFACE_ENTRY(IILCShellFolder)
        //COM_INTERFACE_ENTRY(IDispatch)
        COM_INTERFACE_ENTRY(IShellFolder)
        COM_INTERFACE_ENTRY(IPersistFolder)
        COM_INTERFACE_ENTRY(IPersist)
END_COM_MAP()

       
        DECLARE_PROTECT_FINAL_CONSTRUCT()

        HRESULT FinalConstruct(){
                return S_OK;
        }

        void FinalRelease(){
        }



    // IShellFolder
        STDMETHOD(BindToObject)(PCUIDLIST_RELATIVE pidl, IBindCtx *pbc, REFIID riid, void **ppvOut);
        STDMETHOD(BindToStorage)(PCUIDLIST_RELATIVE pidl, IBindCtx *pbc, REFIID riid, void **ppvOut);
        STDMETHOD (CompareIDs)(LPARAM lParam, PCUIDLIST_RELATIVE pidl1, PCUIDLIST_RELATIVE pidl2);
        STDMETHOD (CreateViewObject)(HWND hwndOwner, REFIID riid, void **ppv);
        STDMETHOD (EnumObjects)(HWND hwndOwner, SHCONTF grfFlags, IEnumIDList **ppenumIDList);
        STDMETHOD (GetAttributesOf)(UINT cidl, PCUITEMID_CHILD_ARRAY apidl, SFGAOF *rgfInOut);
    STDMETHOD (GetDisplayNameOf)(PCUITEMID_CHILD pidl, SHGDNF uFlags, STRRET *pName);
        STDMETHOD (GetUIObjectOf)(HWND hwndOwner, UINT cidl, PCUITEMID_CHILD_ARRAY apidl, REFIID riid, UINT *rgfReserved, void **ppv);
        STDMETHOD (ParseDisplayName)(HWND hwnd, IBindCtx *pbc, LPWSTR pszDisplayName, ULONG *pchEaten, PIDLIST_RELATIVE *ppidl, ULONG *pdwAttributes);
        STDMETHOD(SetNameOf)(HWND hwndOwner, PCUITEMID_CHILD pidl, LPCWSTR pszName, SHGDNF uFlags, PITEMID_CHILD *ppidlOut);

        // IPersistFolder
        STDMETHOD (Initialize)(LPCITEMIDLIST pidl);

        // IPersist
    STDMETHOD( GetClassID)(CLSID*);

       
public:



};

OBJECT_ENTRY_AUTO(__uuidof(ILCShellFolder), CILCShellFolder)



Code:

// ILCShellFolder.cpp: Implementierung von CILCShellFolder

#include "stdafx.h"
#include "ILCShellFolder.h"



STDMETHODIMP CILCShellFolder::BindToObject(PCUIDLIST_RELATIVE pidl, IBindCtx *pbc, REFIID riid, void **ppvOut){
        MessageBox(GetDesktopWindow(), TEXT("Test"), TEXT("Test"), MB_OK);
        return S_OK;
}


STDMETHODIMP CILCShellFolder::BindToStorage(PCUIDLIST_RELATIVE pidl, IBindCtx *pbc, REFIID riid, void **ppvOut){
        MessageBox(GetDesktopWindow(), TEXT("Test"), TEXT("Test"), MB_OK);
        return S_OK;
}


STDMETHODIMP CILCShellFolder::CompareIDs(LPARAM lParam, PCUIDLIST_RELATIVE pidl1, PCUIDLIST_RELATIVE pidl2){
        MessageBox(GetDesktopWindow(), TEXT("Test"), TEXT("Test"), MB_OK);
        return S_OK;
}


STDMETHODIMP CILCShellFolder::CreateViewObject(HWND hwndOwner, REFIID riid, void **ppv){
        MessageBox(GetDesktopWindow(), TEXT("Test"), TEXT("Test"), MB_OK);
        return S_OK;
}


STDMETHODIMP CILCShellFolder::EnumObjects(HWND hwndOwner, SHCONTF grfFlags, IEnumIDList **ppenumIDList){
        MessageBox(GetDesktopWindow(), TEXT("Test"), TEXT("Test"), MB_OK);
        return S_OK;
}


STDMETHODIMP CILCShellFolder::GetAttributesOf(UINT cidl, PCUITEMID_CHILD_ARRAY apidl, SFGAOF *rgfInOut){
        MessageBox(GetDesktopWindow(), TEXT("Test"), TEXT("Test"), MB_OK);
        return S_OK;
}


STDMETHODIMP CILCShellFolder::GetDisplayNameOf(PCUITEMID_CHILD pidl, SHGDNF uFlags, STRRET *pName){
        MessageBox(GetDesktopWindow(), TEXT("Test"), TEXT("Test"), MB_OK);
        return S_OK;
}


STDMETHODIMP CILCShellFolder::GetUIObjectOf(HWND hwndOwner, UINT cidl, PCUITEMID_CHILD_ARRAY apidl, REFIID riid, UINT *rgfReserved, void **ppv){
        MessageBox(GetDesktopWindow(), TEXT("Test"), TEXT("Test"), MB_OK);
        return S_OK;
}


STDMETHODIMP CILCShellFolder::ParseDisplayName(HWND hwnd, IBindCtx *pbc, LPWSTR pszDisplayName, ULONG *pchEaten, PIDLIST_RELATIVE *ppidl, ULONG *pdwAttributes){
        MessageBox(GetDesktopWindow(), TEXT("Test"), TEXT("Test"), MB_OK);
        return S_OK;
}


STDMETHODIMP CILCShellFolder::SetNameOf(HWND hwndOwner, PCUITEMID_CHILD pidl, LPCWSTR pszName, SHGDNF uFlags, PITEMID_CHILD *ppidlOut){
        MessageBox(GetDesktopWindow(), TEXT("Test"), TEXT("Test"), MB_OK);
        return S_OK;
}


STDMETHODIMP CILCShellFolder::Initialize(LPCITEMIDLIST pidl){
        MessageBox(GetDesktopWindow(), TEXT("Test"), TEXT("Test"), MB_OK);
        return NULL;
}



STDMETHODIMP CILCShellFolder::GetClassID(CLSID* pClsid){
        MessageBox(GetDesktopWindow(), TEXT("Test"), TEXT("Test"), MB_OK);
        return S_OK;
}


Code:

HKCR
{
        NoRemove CLSID
        {
                ForceRemove {2AB83D0B-097B-4F36-B84A-D65C1660E714} = s 'ILCShellFolder Class'
                {
                        ForceRemove Programmable
                        InprocServer32 = s '%MODULE%'
                        {
                                val ThreadingModel = s 'Apartment'
                        }
                        TypeLib = s '{F7217BA8-D6D4-4307-8737-48E8A4A12723}'
                        Version = s '1.0'

                        DefaultIcon = s '%MODULE%,0'
                        ShellFolder
            {
                val Attributes = d '2818572288'
            }
                }
        }
}


GUIDS:
MIDL_DEFINE_GUID(CLSID, CLSID_ILCShellFolder,0x2AB83D0B,0x097B,0x4F36,0xB8,0x4A,0xD6,0x5C,0x16,0x60,0xE7,0x14);
MIDL_DEFINE_GUID(CLSID, CLSID_ILCShellView,0x3B104ACE,0x4749,0x4114,0xBC,0x10,0x05,0x24,0xF4,0x02,0xF5,0x42);


Not any of those IShellFolder Methods is being called...
When I attach the explorer.exe process (which I know I can use to debug on other projects, just in case to exclude errors) it tells me that the DLL is not loaded by the explorer.exe process. What am I doing wrong? Can you please help me?




Kind regards,
Michael

Viewing all articles
Browse latest Browse all 3046

Trending Articles