December 13th, 2012, 08:28 AM
#1
Shell (Namespace) Extension won't register, what am I doing wrong?
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
Last edited by chaos2oo2; December 13th, 2012 at 08:32 AM .
Posting Permissions
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts
Forum Rules
Click Here to Expand Forum to Full Width
Bookmarks