[SHELL32]
[reactos.git] / dll / win32 / shell32 / shellole.cpp
index 5ad879e..be2ed6a 100644 (file)
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
  */
 
-#include <precomp.h>
+#include "precomp.h"
 
 WINE_DEFAULT_DEBUG_CHANNEL(shell);
 
-extern HRESULT WINAPI IFSFolder_Constructor(IUnknown * pUnkOuter, REFIID riid, LPVOID * ppv);
-
 static const WCHAR sShell32[12] = {'S','H','E','L','L','3','2','.','D','L','L','\0'};
 
-/**************************************************************************
- * Default ClassFactory types
- */
-typedef HRESULT (CALLBACK *LPFNCREATEINSTANCE)(IUnknown* pUnkOuter, REFIID riid, LPVOID* ppvObject);
-HRESULT IDefClF_fnConstructor(LPFNCREATEINSTANCE lpfnCI, PLONG pcRefDll, const IID *riidInst, IClassFactory **theFactory);
-
 /* FIXME: this should be SHLWAPI.24 since we can't yet import by ordinal */
 
 DWORD WINAPI __SHGUIDToStringW (REFGUID guid, LPWSTR str)
@@ -70,7 +62,7 @@ DWORD WINAPI __SHGUIDToStringW (REFGUID guid, LPWSTR str)
 HRESULT WINAPI SHCoCreateInstance(
     LPCWSTR aclsid,
     const CLSID *clsid,
-    LPUNKNOWN pUnkOuter,
+    IUnknown * pUnkOuter,
     REFIID refiid,
     LPVOID *ppv)
 {
@@ -129,7 +121,7 @@ HRESULT WINAPI SHCoCreateInstance(
 
     /* now we create an instance */
     if (bLoadFromShell32) {
-        if (! SUCCEEDED(DllGetClassObject(*myclsid, IID_IClassFactory, (LPVOID*)&pcf))) {
+        if (! SUCCEEDED(DllGetClassObject(*myclsid, IID_PPV_ARG(IClassFactory, &pcf)))) {
             ERR("LoadFromShell failed for CLSID=%s\n", shdebugstr_guid(myclsid));
         }
     } else if (bLoadWithoutCOM) {
@@ -148,7 +140,7 @@ HRESULT WINAPI SHCoCreateInstance(
             FreeLibrary( hLibrary );
         hres = E_ACCESSDENIED;
             goto end;
-        } else if (! SUCCEEDED(hres = DllGetClassObject(*myclsid, IID_IClassFactory, (LPVOID*)&pcf))) {
+        } else if (! SUCCEEDED(hres = DllGetClassObject(*myclsid, IID_PPV_ARG(IClassFactory, &pcf)))) {
             TRACE("GetClassObject failed 0x%08x\n", hres);
             goto end;
         }
@@ -276,155 +268,6 @@ void WINAPI SHFree(LPVOID pv)
     CoTaskMemFree(pv);
 }
 
-/*************************************************************************
- * SHGetDesktopFolder            [SHELL32.@]
- */
-HRESULT WINAPI SHGetDesktopFolder(IShellFolder **psf)
-{
-    HRESULT    hres = S_OK;
-    TRACE("\n");
-
-    if(!psf) return E_INVALIDARG;
-    *psf = NULL;
-    hres = CDesktopFolder::_CreatorClass::CreateInstance(NULL, IID_IShellFolder, (void**)psf);
-
-    TRACE("-- %p->(%p)\n",psf, *psf);
-    return hres;
-}
-/**************************************************************************
- * Default ClassFactory Implementation
- *
- * SHCreateDefClassObject
- *
- * NOTES
- *  Helper function for dlls without their own classfactory.
- *  A generic classfactory is returned.
- *  When the CreateInstance of the cf is called the callback is executed.
- */
-
-class IDefClFImpl :
-    public CComObjectRootEx<CComMultiThreadModelNoCS>,
-    public IClassFactory
-{
-private:
-    CLSID                    *rclsid;
-    LPFNCREATEINSTANCE        lpfnCI;
-    const IID                *riidInst;
-    LONG                    *pcRefDll;        /* pointer to refcounter in external dll (ugrrr...) */
-public:
-    IDefClFImpl();
-    HRESULT Initialize(LPFNCREATEINSTANCE lpfnCI, PLONG pcRefDll, const IID *riidInstx);
-
-    // IClassFactory
-    virtual HRESULT WINAPI CreateInstance(LPUNKNOWN pUnkOuter, REFIID riid, LPVOID *ppvObject);
-    virtual HRESULT WINAPI LockServer(BOOL fLock);
-
-BEGIN_COM_MAP(IDefClFImpl)
-    COM_INTERFACE_ENTRY_IID(IID_IClassFactory, IClassFactory)
-END_COM_MAP()
-};
-
-IDefClFImpl::IDefClFImpl()
-{
-    lpfnCI = NULL;
-    riidInst = NULL;
-    pcRefDll = NULL;
-    rclsid = NULL;
-}
-
-HRESULT IDefClFImpl::Initialize(LPFNCREATEINSTANCE lpfnCIx, PLONG pcRefDllx, const IID *riidInstx)
-{
-    lpfnCI = lpfnCIx;
-    riidInst = riidInstx;
-    pcRefDll = pcRefDllx;
-
-    if (pcRefDll)
-        InterlockedIncrement(pcRefDll);
-
-    TRACE("(%p)%s\n", this, shdebugstr_guid(riidInst));
-    return S_OK;
-}
-
-/******************************************************************************
- * IDefClF_fnCreateInstance
- */
-HRESULT WINAPI IDefClFImpl::CreateInstance(LPUNKNOWN pUnkOuter, REFIID riid, LPVOID *ppvObject)
-{
-    TRACE("%p->(%p,%s,%p)\n", this, pUnkOuter, shdebugstr_guid(&riid), ppvObject);
-
-    *ppvObject = NULL;
-
-    if (riidInst == NULL || IsEqualCLSID(riid, *riidInst) || IsEqualCLSID(riid, IID_IUnknown))
-    {
-        return lpfnCI(pUnkOuter, riid, ppvObject);
-    }
-
-    ERR("unknown IID requested %s\n", shdebugstr_guid(&riid));
-    return E_NOINTERFACE;
-}
-
-/******************************************************************************
- * IDefClF_fnLockServer
- */
-HRESULT WINAPI IDefClFImpl::LockServer(BOOL fLock)
-{
-    TRACE("%p->(0x%x), not implemented\n", this, fLock);
-    return E_NOTIMPL;
-}
-
-/**************************************************************************
- *  IDefClF_fnConstructor
- */
-
-HRESULT IDefClF_fnConstructor(LPFNCREATEINSTANCE lpfnCI, PLONG pcRefDll, const IID *riidInst, IClassFactory **theFactory)
-{
-    CComObject<IDefClFImpl>                    *theClassObject;
-    CComPtr<IClassFactory>                    result;
-    HRESULT                                    hResult;
-
-    if (theFactory == NULL)
-        return E_POINTER;
-    *theFactory = NULL;
-    ATLTRY (theClassObject = new CComObject<IDefClFImpl>);
-    if (theClassObject == NULL)
-        return E_OUTOFMEMORY;
-    hResult = theClassObject->QueryInterface (IID_IClassFactory, (void **)&result);
-    if (FAILED (hResult))
-    {
-        delete theClassObject;
-        return hResult;
-    }
-    hResult = theClassObject->Initialize (lpfnCI, pcRefDll, riidInst);
-    if (FAILED (hResult))
-        return hResult;
-    *theFactory = result.Detach ();
-    return S_OK;
-}
-
-/******************************************************************************
- * SHCreateDefClassObject            [SHELL32.70]
- */
-HRESULT WINAPI SHCreateDefClassObject(
-    REFIID    riid,
-    LPVOID*    ppv,
-    LPFNCREATEINSTANCE lpfnCI,    /* [in] create instance callback entry */
-    LPDWORD    pcRefDll,        /* [in/out] ref count of the dll */
-    REFIID    riidInst)        /* [in] optional interface to the instance */
-{
-    IClassFactory                *pcf;
-    HRESULT                        hResult;
-
-    TRACE("%s %p %p %p %s\n", shdebugstr_guid(&riid), ppv, lpfnCI, pcRefDll, shdebugstr_guid(&riidInst));
-
-    if (!IsEqualCLSID(riid, IID_IClassFactory))
-        return E_NOINTERFACE;
-    hResult = IDefClF_fnConstructor(lpfnCI, (PLONG)pcRefDll, &riidInst, &pcf);
-    if (FAILED(hResult))
-        return hResult;
-    *ppv = pcf;
-    return NOERROR;
-}
-
 /*************************************************************************
  *  DragAcceptFiles        [SHELL32.@]
  */
@@ -602,7 +445,7 @@ EXTERN_C HRESULT WINAPI SHPropStgCreate(IPropertySetStorage *psstg, REFFMTID fmt
          case CREATE_ALWAYS:
              if (SUCCEEDED(hres))
              {
-                 reinterpret_cast<IPropertyStorage*>(*ppstg)->Release();
+                 (*ppstg)->Release();
                  hres = psstg->Delete(fmtid);
                  if(FAILED(hres))
                      return hres;
@@ -622,7 +465,7 @@ EXTERN_C HRESULT WINAPI SHPropStgCreate(IPropertySetStorage *psstg, REFFMTID fmt
              {
                  prop.ulKind = PRSPEC_PROPID;
                  prop.propid = PID_CODEPAGE;
-                 hres = reinterpret_cast<IPropertyStorage*>(*ppstg)->ReadMultiple(1, &prop, &ret);
+                 hres = (*ppstg)->ReadMultiple(1, &prop, &ret);
                  if (FAILED(hres) || ret.vt!=VT_I2)
                      *puCodePage = 0;
                  else
@@ -712,3 +555,14 @@ EXTERN_C HRESULT WINAPI SHPropStgWriteMultiple(IPropertyStorage *pps, UINT *uCod
     hres = pps->WriteMultiple(cpspec, rgpspec, rgvar, propidNameFirst);
     return hres;
 }
+
+/*************************************************************************
+ *  SHCreateQueryCancelAutoPlayMoniker [SHELL32.@]
+ */
+HRESULT WINAPI SHCreateQueryCancelAutoPlayMoniker(IMoniker **moniker)
+{
+    TRACE("%p\n", moniker);
+
+    if (!moniker) return E_INVALIDARG;
+    return CreateClassMoniker(CLSID_QueryCancelAutoPlay, moniker);
+}