Commit 1e5ec889 authored by Juergen Schmied's avatar Juergen Schmied Committed by Alexandre Julliard

- Cleaned up the implementation of shell folders and put them into

separate files. - Fixed some memory leaks. - Some more fixes.
parent 75ce72ea
...@@ -26,18 +26,21 @@ C_SRCS = \ ...@@ -26,18 +26,21 @@ C_SRCS = \
iconcache.c \ iconcache.c \
memorystream.c \ memorystream.c \
pidl.c \ pidl.c \
shell32_main.c \
shell.c \ shell.c \
shell32_main.c \
shelllink.c \ shelllink.c \
shlmenu.c \
shellole.c \ shellole.c \
shellord.c \ shellord.c \
shellpath.c \ shellpath.c \
shellstring.c \
shellreg.c \ shellreg.c \
shellstring.c \
shfldr_desktop.c \
shfldr_fs.c \
shfldr_mycomp.c \
shlexec.c \ shlexec.c \
shlfileop.c \ shlfileop.c \
shlfolder.c \ shlfolder.c \
shlmenu.c \
shlview.c \ shlview.c \
shpolicy.c \ shpolicy.c \
shv_bg_cmenu.c \ shv_bg_cmenu.c \
......
...@@ -14,6 +14,11 @@ ...@@ -14,6 +14,11 @@
* You should have received a copy of the GNU Lesser General Public * You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software * License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* FIXME:
* - view with root unequal desktop
* - many memory leaks
* - show only filesystem objects
*/ */
#include <stdlib.h> #include <stdlib.h>
...@@ -52,7 +57,7 @@ static void InitializeTreeView(HWND hwndParent, LPCITEMIDLIST root) ...@@ -52,7 +57,7 @@ static void InitializeTreeView(HWND hwndParent, LPCITEMIDLIST root)
/* so far, this method doesn't work (still missing the upper level), keep the old way */ /* so far, this method doesn't work (still missing the upper level), keep the old way */
#if 0 #if 0
if (root == NULL) { if (_ILIsDesktop (root)) {
hr = SHGetDesktopFolder(&lpsf); hr = SHGetDesktopFolder(&lpsf);
} else { } else {
IShellFolder * lpsfdesktop; IShellFolder * lpsfdesktop;
......
...@@ -30,7 +30,7 @@ ...@@ -30,7 +30,7 @@
#include "shell32_main.h" #include "shell32_main.h"
#include "shlguid.h" #include "shlguid.h"
#include "shresdef.h" #include "shresdef.h"
#include "wine/obj_queryassociations.h" #include "shlwapi.h"
WINE_DEFAULT_DEBUG_CHANNEL(shell); WINE_DEFAULT_DEBUG_CHANNEL(shell);
...@@ -62,36 +62,24 @@ BOOL HCR_MapTypeToValue ( LPCSTR szExtension, LPSTR szFileType, DWORD len, BOOL ...@@ -62,36 +62,24 @@ BOOL HCR_MapTypeToValue ( LPCSTR szExtension, LPSTR szFileType, DWORD len, BOOL
RegCloseKey(hkey); RegCloseKey(hkey);
TRACE("-- %s\n", szFileType ); TRACE("--UE;
} %s\n", szFileType );
return TRUE; return TRUE;
} }
BOOL HCR_GetExecuteCommand ( LPCSTR szClass, LPCSTR szVerb, LPSTR szDest, DWORD len ) BOOL HCR_GetExecuteCommand ( LPCSTR szClass, LPCSTR szVerb, LPSTR szDest, DWORD len )
{ {
HKEY hkey;
char sTemp[MAX_PATH]; char sTemp[MAX_PATH];
DWORD dwType;
BOOL ret = FALSE;
TRACE("%s %s\n",szClass, szVerb ); TRACE("%s %s\n",szClass, szVerb );
sprintf(sTemp, "%s\\shell\\%s\\command",szClass, szVerb); snprintf(sTemp, MAX_PATH, "%s\\shell\\%s\\command",szClass, szVerb);
if (!RegOpenKeyExA(HKEY_CLASSES_ROOT,sTemp,0,0x02000000,&hkey)) if (ERROR_SUCCESS == SHGetValueA(HKEY_CLASSES_ROOT, sTemp, NULL, NULL, szDest, &len)) {
{ TRACE("-- %s\n", debugstr_a(szDest) );
if (!RegQueryValueExA(hkey, NULL, 0, &dwType, szDest, &len)) return TRUE;
{
if (dwType == REG_EXPAND_SZ)
{
ExpandEnvironmentStringsA(szDest, sTemp, MAX_PATH);
strcpy(szDest, sTemp);
}
ret = TRUE;
}
RegCloseKey(hkey);
} }
TRACE("-- %s\n", szDest ); return FALSE;
return ret;
} }
/*************************************************************************************** /***************************************************************************************
* HCR_GetDefaultIcon [internal] * HCR_GetDefaultIcon [internal]
...@@ -243,7 +231,6 @@ IQueryAssociations* IQueryAssociations_Constructor(void) ...@@ -243,7 +231,6 @@ IQueryAssociations* IQueryAssociations_Constructor(void)
ICOM_VTBL(ei) = &qavt; ICOM_VTBL(ei) = &qavt;
TRACE("(%p)\n",ei); TRACE("(%p)\n",ei);
shell32_ObjCount++;
return (IQueryAssociations *)ei; return (IQueryAssociations *)ei;
} }
/************************************************************************** /**************************************************************************
...@@ -288,8 +275,6 @@ static ULONG WINAPI IQueryAssociations_fnAddRef(IQueryAssociations * iface) ...@@ -288,8 +275,6 @@ static ULONG WINAPI IQueryAssociations_fnAddRef(IQueryAssociations * iface)
TRACE("(%p)->(count=%lu)\n",This, This->ref ); TRACE("(%p)->(count=%lu)\n",This, This->ref );
shell32_ObjCount++;
return ++(This->ref); return ++(This->ref);
} }
/************************************************************************** /**************************************************************************
...@@ -301,8 +286,6 @@ static ULONG WINAPI IQueryAssociations_fnRelease(IQueryAssociations * iface) ...@@ -301,8 +286,6 @@ static ULONG WINAPI IQueryAssociations_fnRelease(IQueryAssociations * iface)
TRACE("(%p)->()\n",This); TRACE("(%p)->()\n",This);
shell32_ObjCount--;
if (!--(This->ref)) if (!--(This->ref))
{ {
TRACE(" destroying IExtractIcon(%p)\n",This); TRACE(" destroying IExtractIcon(%p)\n",This);
......
...@@ -84,8 +84,6 @@ LPENUMFORMATETC IEnumFORMATETC_Constructor(UINT cfmt, const FORMATETC afmt[]) ...@@ -84,8 +84,6 @@ LPENUMFORMATETC IEnumFORMATETC_Constructor(UINT cfmt, const FORMATETC afmt[])
{ {
memcpy(ef->pFmt, afmt, size); memcpy(ef->pFmt, afmt, size);
} }
shell32_ObjCount++;
} }
TRACE("(%p)->(%u,%p)\n",ef, cfmt, afmt); TRACE("(%p)->(%u,%p)\n",ef, cfmt, afmt);
...@@ -123,7 +121,6 @@ static ULONG WINAPI IEnumFORMATETC_fnAddRef(LPENUMFORMATETC iface) ...@@ -123,7 +121,6 @@ static ULONG WINAPI IEnumFORMATETC_fnAddRef(LPENUMFORMATETC iface)
{ {
ICOM_THIS(IEnumFORMATETCImpl,iface); ICOM_THIS(IEnumFORMATETCImpl,iface);
TRACE("(%p)->(count=%lu)\n",This, This->ref); TRACE("(%p)->(count=%lu)\n",This, This->ref);
shell32_ObjCount++;
return ++(This->ref); return ++(This->ref);
} }
...@@ -132,8 +129,6 @@ static ULONG WINAPI IEnumFORMATETC_fnRelease(LPENUMFORMATETC iface) ...@@ -132,8 +129,6 @@ static ULONG WINAPI IEnumFORMATETC_fnRelease(LPENUMFORMATETC iface)
ICOM_THIS(IEnumFORMATETCImpl,iface); ICOM_THIS(IEnumFORMATETCImpl,iface);
TRACE("(%p)->()\n",This); TRACE("(%p)->()\n",This);
shell32_ObjCount--;
if (!--(This->ref)) if (!--(This->ref))
{ {
TRACE(" destroying IEnumFORMATETC(%p)\n",This); TRACE(" destroying IEnumFORMATETC(%p)\n",This);
...@@ -246,8 +241,6 @@ LPDATAOBJECT IDataObject_Constructor(HWND hwndOwner, LPITEMIDLIST pMyPidl, LPITE ...@@ -246,8 +241,6 @@ LPDATAOBJECT IDataObject_Constructor(HWND hwndOwner, LPITEMIDLIST pMyPidl, LPITE
InitFormatEtc(dto->pFormatEtc[0], dto->cfShellIDList, TYMED_HGLOBAL); InitFormatEtc(dto->pFormatEtc[0], dto->cfShellIDList, TYMED_HGLOBAL);
InitFormatEtc(dto->pFormatEtc[1], CF_HDROP, TYMED_HGLOBAL); InitFormatEtc(dto->pFormatEtc[1], CF_HDROP, TYMED_HGLOBAL);
InitFormatEtc(dto->pFormatEtc[2], dto->cfFileName, TYMED_HGLOBAL); InitFormatEtc(dto->pFormatEtc[2], dto->cfFileName, TYMED_HGLOBAL);
shell32_ObjCount++;
} }
TRACE("(%p)->(apidl=%p cidl=%u)\n",dto, apidl, cidl); TRACE("(%p)->(apidl=%p cidl=%u)\n",dto, apidl, cidl);
...@@ -289,10 +282,7 @@ static HRESULT WINAPI IDataObject_fnQueryInterface(LPDATAOBJECT iface, REFIID ri ...@@ -289,10 +282,7 @@ static HRESULT WINAPI IDataObject_fnQueryInterface(LPDATAOBJECT iface, REFIID ri
static ULONG WINAPI IDataObject_fnAddRef(LPDATAOBJECT iface) static ULONG WINAPI IDataObject_fnAddRef(LPDATAOBJECT iface)
{ {
ICOM_THIS(IDataObjectImpl,iface); ICOM_THIS(IDataObjectImpl,iface);
TRACE("(%p)->(count=%lu)\n",This, This->ref); TRACE("(%p)->(count=%lu)\n",This, This->ref);
shell32_ObjCount++;
return ++(This->ref); return ++(This->ref);
} }
...@@ -304,12 +294,11 @@ static ULONG WINAPI IDataObject_fnRelease(LPDATAOBJECT iface) ...@@ -304,12 +294,11 @@ static ULONG WINAPI IDataObject_fnRelease(LPDATAOBJECT iface)
ICOM_THIS(IDataObjectImpl,iface); ICOM_THIS(IDataObjectImpl,iface);
TRACE("(%p)->()\n",This); TRACE("(%p)->()\n",This);
shell32_ObjCount--;
if (!--(This->ref)) if (!--(This->ref))
{ {
TRACE(" destroying IDataObject(%p)\n",This); TRACE(" destroying IDataObject(%p)\n",This);
_ILFreeaPidl(This->apidl, This->cidl); _ILFreeaPidl(This->apidl, This->cidl);
ILFree(This->pidl),
HeapFree(GetProcessHeap(),0,This); HeapFree(GetProcessHeap(),0,This);
return 0; return 0;
} }
...@@ -454,4 +443,3 @@ static struct ICOM_VTABLE(IDataObject) dtovt = ...@@ -454,4 +443,3 @@ static struct ICOM_VTABLE(IDataObject) dtovt =
IDataObject_fnDUnadvise, IDataObject_fnDUnadvise,
IDataObject_fnEnumDAdvise IDataObject_fnEnumDAdvise
}; };
...@@ -127,10 +127,6 @@ REFIID _dbg_ILGetGUIDPointer(LPCITEMIDLIST pidl) ...@@ -127,10 +127,6 @@ REFIID _dbg_ILGetGUIDPointer(LPCITEMIDLIST pidl)
case PT_SPECIAL: case PT_SPECIAL:
case PT_MYCOMP: case PT_MYCOMP:
return (REFIID) &(pdata->u.mycomp.guid); return (REFIID) &(pdata->u.mycomp.guid);
default:
TRACE("Unknown pidl type 0x%04x\n", pdata->type);
break;
} }
} }
return NULL; return NULL;
...@@ -169,10 +165,6 @@ DWORD _dbg_ILSimpleGetText (LPCITEMIDLIST pidl, LPSTR szOut, UINT uOutSize) ...@@ -169,10 +165,6 @@ DWORD _dbg_ILSimpleGetText (LPCITEMIDLIST pidl, LPSTR szOut, UINT uOutSize)
riid->Data4[4], riid->Data4[5], riid->Data4[6], riid->Data4[7] ); riid->Data4[4], riid->Data4[5], riid->Data4[6], riid->Data4[7] );
dwReturn = strlen (szTemp); dwReturn = strlen (szTemp);
} }
else
{
ERR("-- no text\n");
}
return dwReturn; return dwReturn;
} }
...@@ -209,7 +201,7 @@ void pdump (LPCITEMIDLIST pidl) ...@@ -209,7 +201,7 @@ void pdump (LPCITEMIDLIST pidl)
else if( PT_VALUE == type) else if( PT_VALUE == type)
dwAttrib = pData->u.file.uFileAttribs; dwAttrib = pData->u.file.uFileAttribs;
MESSAGE ("-- pidl=%p size=%u type=%lx attr=0x%08lx name=%s (%s,%s)\n", MESSAGE ("[%p] size=%04u type=%lx attr=0x%08lx name=\"%s\" (%s,%s)\n",
pidltemp, pidltemp->mkid.cb,type,dwAttrib,szName,debugstr_a(szLongName), debugstr_a(szShortName)); pidltemp, pidltemp->mkid.cb,type,dwAttrib,szName,debugstr_a(szLongName), debugstr_a(szShortName));
pidltemp = _dbg_ILGetNext(pidltemp); pidltemp = _dbg_ILGetNext(pidltemp);
...@@ -267,7 +259,7 @@ BOOL pcheck (LPCITEMIDLIST pidl) ...@@ -267,7 +259,7 @@ BOOL pcheck (LPCITEMIDLIST pidl)
szTemp[i+BYTES_PRINTED*3] = (c>=0x20 && c <=0x80) ? c : '.'; szTemp[i+BYTES_PRINTED*3] = (c>=0x20 && c <=0x80) ? c : '.';
} }
szTemp[BYTES_PRINTED*4] = 0x00; szTemp[BYTES_PRINTED*4] = 0x00;
ERR("unknown IDLIST type size=%u type=%lx\n%s\n",pidltemp->mkid.cb,type, szTemp); ERR("unknown IDLIST %p [%p] size=%u type=%lx\n%s\n",pidl, pidltemp, pidltemp->mkid.cb,type, szTemp);
ret = FALSE; ret = FALSE;
} }
} }
...@@ -277,14 +269,16 @@ BOOL pcheck (LPCITEMIDLIST pidl) ...@@ -277,14 +269,16 @@ BOOL pcheck (LPCITEMIDLIST pidl)
return ret; return ret;
} }
static char shdebugstr_buf[100]; static char shdebugstr_buf1[100];
static char shdebugstr_buf2[100];
static char * shdebugstr_buf = shdebugstr_buf1;
static struct { static struct {
REFIID riid; REFIID riid;
char *name; char *name;
} InterfaceDesc[] = { } InterfaceDesc[] = {
{&IID_IUnknown, "IID_IUnknown"}, {&IID_IUnknown, "IID_IUnknown"},
{&IID_IClassFactory, "IID_IClassFactory"},
{&IID_IShellView, "IID_IShellView"}, {&IID_IShellView, "IID_IShellView"},
{&IID_IOleCommandTarget, "IID_IOleCommandTarget"}, {&IID_IOleCommandTarget, "IID_IOleCommandTarget"},
{&IID_IDropTarget, "IID_IDropTarget"}, {&IID_IDropTarget, "IID_IDropTarget"},
...@@ -309,6 +303,8 @@ const char * shdebugstr_guid( const struct _GUID *id ) ...@@ -309,6 +303,8 @@ const char * shdebugstr_guid( const struct _GUID *id )
char* name = NULL; char* name = NULL;
char clsidbuf[100]; char clsidbuf[100];
shdebugstr_buf = (shdebugstr_buf == shdebugstr_buf1) ? shdebugstr_buf2 : shdebugstr_buf1;
if (!id) { if (!id) {
strcpy (shdebugstr_buf, "(null)"); strcpy (shdebugstr_buf, "(null)");
} else { } else {
......
...@@ -317,9 +317,9 @@ IEnumIDList * IEnumIDList_Constructor( ...@@ -317,9 +317,9 @@ IEnumIDList * IEnumIDList_Constructor(
IEnumIDListImpl* lpeidl; IEnumIDListImpl* lpeidl;
BOOL ret = FALSE; BOOL ret = FALSE;
lpeidl = (IEnumIDListImpl*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IEnumIDListImpl)); TRACE("()->(%s flags=0x%08lx kind=0x%08lx)\n",debugstr_a(lpszPath),dwFlags, dwKind);
TRACE("(%p)->(%s flags=0x%08lx kind=0x%08lx)\n",lpeidl,debugstr_a(lpszPath),dwFlags, dwKind); lpeidl = (IEnumIDListImpl*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IEnumIDListImpl));
if (lpeidl) if (lpeidl)
{ {
...@@ -341,16 +341,9 @@ IEnumIDList * IEnumIDList_Constructor( ...@@ -341,16 +341,9 @@ IEnumIDList * IEnumIDList_Constructor(
break; break;
} }
if(ret) if(!ret) {
{
shell32_ObjCount++;
}
else
{
if (lpeidl)
{
HeapFree(GetProcessHeap(),0,lpeidl); HeapFree(GetProcessHeap(),0,lpeidl);
} lpeidl = NULL;
} }
} }
...@@ -397,10 +390,7 @@ static ULONG WINAPI IEnumIDList_fnAddRef( ...@@ -397,10 +390,7 @@ static ULONG WINAPI IEnumIDList_fnAddRef(
IEnumIDList * iface) IEnumIDList * iface)
{ {
ICOM_THIS(IEnumIDListImpl,iface); ICOM_THIS(IEnumIDListImpl,iface);
TRACE("(%p)->(%lu)\n",This,This->ref); TRACE("(%p)->(%lu)\n",This,This->ref);
shell32_ObjCount++;
return ++(This->ref); return ++(This->ref);
} }
/****************************************************************************** /******************************************************************************
...@@ -413,10 +403,8 @@ static ULONG WINAPI IEnumIDList_fnRelease( ...@@ -413,10 +403,8 @@ static ULONG WINAPI IEnumIDList_fnRelease(
TRACE("(%p)->(%lu)\n",This,This->ref); TRACE("(%p)->(%lu)\n",This,This->ref);
shell32_ObjCount--; if (!--(This->ref)) {
TRACE(" destroying IEnumIDList(%p)\n",This);
if (!--(This->ref))
{ TRACE(" destroying IEnumIDList(%p)\n",This);
DeleteList((IEnumIDList*)This); DeleteList((IEnumIDList*)This);
HeapFree(GetProcessHeap(),0,This); HeapFree(GetProcessHeap(),0,This);
return 0; return 0;
......
...@@ -69,7 +69,6 @@ IExtractIconA* IExtractIconA_Constructor(LPCITEMIDLIST pidl) ...@@ -69,7 +69,6 @@ IExtractIconA* IExtractIconA_Constructor(LPCITEMIDLIST pidl)
pdump(pidl); pdump(pidl);
TRACE("(%p)\n",ei); TRACE("(%p)\n",ei);
shell32_ObjCount++;
return (IExtractIconA *)ei; return (IExtractIconA *)ei;
} }
/************************************************************************** /**************************************************************************
...@@ -111,8 +110,6 @@ static ULONG WINAPI IExtractIconA_fnAddRef(IExtractIconA * iface) ...@@ -111,8 +110,6 @@ static ULONG WINAPI IExtractIconA_fnAddRef(IExtractIconA * iface)
TRACE("(%p)->(count=%lu)\n",This, This->ref ); TRACE("(%p)->(count=%lu)\n",This, This->ref );
shell32_ObjCount++;
return ++(This->ref); return ++(This->ref);
} }
/************************************************************************** /**************************************************************************
...@@ -124,8 +121,6 @@ static ULONG WINAPI IExtractIconA_fnRelease(IExtractIconA * iface) ...@@ -124,8 +121,6 @@ static ULONG WINAPI IExtractIconA_fnRelease(IExtractIconA * iface)
TRACE("(%p)->()\n",This); TRACE("(%p)->()\n",This);
shell32_ObjCount--;
if (!--(This->ref)) if (!--(This->ref))
{ TRACE(" destroying IExtractIcon(%p)\n",This); { TRACE(" destroying IExtractIcon(%p)\n",This);
SHFree(This->pidl); SHFree(This->pidl);
...@@ -340,4 +335,3 @@ static struct ICOM_VTABLE(IPersistFile) pfvt = ...@@ -340,4 +335,3 @@ static struct ICOM_VTABLE(IPersistFile) pfvt =
(void *) 0xdeadbeef /* IEIPersistFile_fnSaveCompleted */, (void *) 0xdeadbeef /* IEIPersistFile_fnSaveCompleted */,
(void *) 0xdeadbeef /* IEIPersistFile_fnGetCurFile */ (void *) 0xdeadbeef /* IEIPersistFile_fnGetCurFile */
}; };
...@@ -96,8 +96,6 @@ HRESULT CreateStreamOnFile (LPCSTR pszFilename, IStream ** ppstm) ...@@ -96,8 +96,6 @@ HRESULT CreateStreamOnFile (LPCSTR pszFilename, IStream ** ppstm)
fstr->ref = 1; fstr->ref = 1;
fstr->dwLength = GetFileSize (hFile, NULL); fstr->dwLength = GetFileSize (hFile, NULL);
shell32_ObjCount++;
if (!(fstr->hMapping = CreateFileMappingA(hFile,NULL,PAGE_READONLY|SEC_COMMIT,0,0,NULL))) if (!(fstr->hMapping = CreateFileMappingA(hFile,NULL,PAGE_READONLY|SEC_COMMIT,0,0,NULL)))
{ {
WARN("failed to create filemap.\n"); WARN("failed to create filemap.\n");
...@@ -158,7 +156,6 @@ static ULONG WINAPI IStream_fnAddRef(IStream *iface) ...@@ -158,7 +156,6 @@ static ULONG WINAPI IStream_fnAddRef(IStream *iface)
TRACE("(%p)->(count=%lu)\n",This, This->ref); TRACE("(%p)->(count=%lu)\n",This, This->ref);
shell32_ObjCount++;
return ++(This->ref); return ++(This->ref);
} }
...@@ -171,8 +168,6 @@ static ULONG WINAPI IStream_fnRelease(IStream *iface) ...@@ -171,8 +168,6 @@ static ULONG WINAPI IStream_fnRelease(IStream *iface)
TRACE("(%p)->()\n",This); TRACE("(%p)->()\n",This);
shell32_ObjCount--;
if (!--(This->ref)) if (!--(This->ref))
{ TRACE(" destroying SHFileStream (%p)\n",This); { TRACE(" destroying SHFileStream (%p)\n",This);
......
...@@ -563,12 +563,15 @@ LPITEMIDLIST WINAPI ILGetNext(LPITEMIDLIST pidl) ...@@ -563,12 +563,15 @@ LPITEMIDLIST WINAPI ILGetNext(LPITEMIDLIST pidl)
{ {
WORD len; WORD len;
TRACE("%p\n", pidl);
if(pidl) if(pidl)
{ {
len = pidl->mkid.cb; len = pidl->mkid.cb;
if (len) if (len)
{ {
pidl = (LPITEMIDLIST) (((LPBYTE)pidl)+len); pidl = (LPITEMIDLIST) (((LPBYTE)pidl)+len);
TRACE("-- %p\n", pidl);
return pidl; return pidl;
} }
} }
...@@ -907,40 +910,28 @@ HRESULT WINAPI SHGetDataFromIDListW(LPSHELLFOLDER psf, LPCITEMIDLIST pidl, int n ...@@ -907,40 +910,28 @@ HRESULT WINAPI SHGetDataFromIDListW(LPSHELLFOLDER psf, LPCITEMIDLIST pidl, int n
* FIXME * FIXME
* fnGetDisplayNameOf can return different types of OLEString * fnGetDisplayNameOf can return different types of OLEString
*/ */
BOOL WINAPI SHGetPathFromIDListA (LPCITEMIDLIST pidl,LPSTR pszPath) BOOL WINAPI SHGetPathFromIDListA (LPCITEMIDLIST pidl, LPSTR pszPath)
{ STRRET str; {
HRESULT hr;
STRRET str;
LPSHELLFOLDER shellfolder; LPSHELLFOLDER shellfolder;
TRACE_(shell)("(pidl=%p,%p)\n",pidl,pszPath); TRACE_(shell)("(pidl=%p,%p)\n",pidl,pszPath);
pdump(pidl);
if (!pidl) return FALSE; if (!pidl) return FALSE;
pdump(pidl); hr = SHGetDesktopFolder(&shellfolder);
if (SUCCEEDED (hr)) {
if(_ILIsDesktop(pidl)) hr = IShellFolder_GetDisplayNameOf(shellfolder,pidl,SHGDN_FORPARSING,&str);
{ if(SUCCEEDED(hr)) {
SHGetSpecialFolderPathA(0, pszPath, CSIDL_DESKTOPDIRECTORY, FALSE);
}
else if (_ILIsSpecialFolder(ILFindLastID(pidl)))
{
/* we are somewhere in a special folder */
return FALSE;
}
else
{
if (SHGetDesktopFolder(&shellfolder)==S_OK)
{
if(!SUCCEEDED(IShellFolder_GetDisplayNameOf(shellfolder,pidl,SHGDN_FORPARSING,&str))) {
IShellFolder_Release(shellfolder);
return FALSE;
}
StrRetToStrNA (pszPath, MAX_PATH, &str, pidl); StrRetToStrNA (pszPath, MAX_PATH, &str, pidl);
IShellFolder_Release(shellfolder);
} }
IShellFolder_Release(shellfolder);
} }
TRACE_(shell)("-- (%s)\n",pszPath);
return TRUE; TRACE_(shell)("-- %s, 0x%08lx\n",pszPath, hr);
return SUCCEEDED(hr);
} }
/************************************************************************* /*************************************************************************
* SHGetPathFromIDListW [SHELL32.@] * SHGetPathFromIDListW [SHELL32.@]
...@@ -1287,7 +1278,7 @@ DWORD _ILGetDrive(LPCITEMIDLIST pidl,LPSTR pOut, UINT uSize) ...@@ -1287,7 +1278,7 @@ DWORD _ILGetDrive(LPCITEMIDLIST pidl,LPSTR pOut, UINT uSize)
*/ */
BOOL _ILIsDesktop(LPCITEMIDLIST pidl) BOOL _ILIsDesktop(LPCITEMIDLIST pidl)
{ TRACE("(%p)\n",pidl); { TRACE("(%p)\n",pidl);
return ( !pidl || (pidl && pidl->mkid.cb == 0x00) ); return pidl && pidl->mkid.cb ? 0 : 1;
} }
BOOL _ILIsMyComputer(LPCITEMIDLIST pidl) BOOL _ILIsMyComputer(LPCITEMIDLIST pidl)
...@@ -1562,12 +1553,18 @@ BOOL _ILGetFileDate (LPCITEMIDLIST pidl, LPSTR pOut, UINT uOutSize) ...@@ -1562,12 +1553,18 @@ BOOL _ILGetFileDate (LPCITEMIDLIST pidl, LPSTR pOut, UINT uOutSize)
{ {
FILETIME ft,lft; FILETIME ft,lft;
SYSTEMTIME time; SYSTEMTIME time;
BOOL ret;
if (! _ILGetFileDateTime( pidl, &ft )) return FALSE; if (_ILGetFileDateTime( pidl, &ft )) {
FileTimeToLocalFileTime(&ft, &lft); FileTimeToLocalFileTime(&ft, &lft);
FileTimeToSystemTime (&lft, &time); FileTimeToSystemTime (&lft, &time);
return GetDateFormatA(LOCALE_USER_DEFAULT,DATE_SHORTDATE,&time, NULL, pOut, uOutSize); ret = GetDateFormatA(LOCALE_USER_DEFAULT,DATE_SHORTDATE,&time, NULL, pOut, uOutSize);
} else {
pOut[0] = '\0';
ret = FALSE;
}
return ret;
} }
/************************************************************************* /*************************************************************************
......
...@@ -289,25 +289,20 @@ DWORD WINAPI SHGetFileInfoA(LPCSTR path,DWORD dwFileAttributes, ...@@ -289,25 +289,20 @@ DWORD WINAPI SHGetFileInfoA(LPCSTR path,DWORD dwFileAttributes,
/* translate the path into a pidl only when SHGFI_USEFILEATTRIBUTES in not specified /* translate the path into a pidl only when SHGFI_USEFILEATTRIBUTES in not specified
the pidl functions fail on not existing file names */ the pidl functions fail on not existing file names */
if (flags & SHGFI_PIDL)
{ if (flags & SHGFI_PIDL) {
pidl = (LPCITEMIDLIST) path; pidl = ILClone((LPCITEMIDLIST)path);
if (!pidl ) } else if (!(flags & SHGFI_USEFILEATTRIBUTES)) {
{ hr = SHILCreateFromPathA(path, &pidl, &dwAttributes);
ERR("pidl is null!\n");
return FALSE;
}
}
else if (!(flags & SHGFI_USEFILEATTRIBUTES))
{
hr = SHILCreateFromPathA ( path, &pidl, &dwAttributes);
/* note: the attributes in ISF::ParseDisplayName are not implemented */
} }
/* get the parent shellfolder */ /* get the parent shellfolder */
if (pidl) if (pidl) {
{
hr = SHBindToParent( pidl, &IID_IShellFolder, (LPVOID*)&psfParent, &pidlLast); hr = SHBindToParent( pidl, &IID_IShellFolder, (LPVOID*)&psfParent, &pidlLast);
ILFree(pidl);
} else {
ERR("pidl is null!\n");
return FALSE;
} }
/* get the attributes of the child */ /* get the attributes of the child */
...@@ -928,7 +923,6 @@ INT (WINAPI *pEnumMRUListA) (HANDLE hList, INT nItemPos, LPVOID lpBuffer, DW ...@@ -928,7 +923,6 @@ INT (WINAPI *pEnumMRUListA) (HANDLE hList, INT nItemPos, LPVOID lpBuffer, DW
static HINSTANCE hComctl32; static HINSTANCE hComctl32;
LONG shell32_ObjCount = 0;
HINSTANCE shell32_hInstance = 0; HINSTANCE shell32_hInstance = 0;
HIMAGELIST ShellSmallIconList = 0; HIMAGELIST ShellSmallIconList = 0;
HIMAGELIST ShellBigIconList = 0; HIMAGELIST ShellBigIconList = 0;
...@@ -995,15 +989,8 @@ BOOL WINAPI Shell32LibMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID fImpLoad) ...@@ -995,15 +989,8 @@ BOOL WINAPI Shell32LibMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID fImpLoad)
case DLL_PROCESS_DETACH: case DLL_PROCESS_DETACH:
shell32_hInstance = 0; shell32_hInstance = 0;
SIC_Destroy(); SIC_Destroy();
FreeChangeNotifications(); FreeChangeNotifications();
/* this one is here to check if AddRef/Release is balanced */
if (shell32_ObjCount)
{
WARN("leaving with %lu objects left (memory leak)\n", shell32_ObjCount);
}
break; break;
} }
return TRUE; return TRUE;
......
...@@ -24,7 +24,7 @@ ...@@ -24,7 +24,7 @@
#include "commctrl.h" #include "commctrl.h"
#include "docobj.h" #include "docobj.h"
#include "undocshell.h"
#include "wine/obj_shellfolder.h" #include "wine/obj_shellfolder.h"
#include "wine/obj_dataobject.h" #include "wine/obj_dataobject.h"
#include "wine/obj_contextmenu.h" #include "wine/obj_contextmenu.h"
...@@ -38,7 +38,6 @@ ...@@ -38,7 +38,6 @@
*/ */
extern HMODULE huser32; extern HMODULE huser32;
extern HINSTANCE shell32_hInstance; extern HINSTANCE shell32_hInstance;
extern LONG shell32_ObjCount;
extern HIMAGELIST ShellSmallIconList; extern HIMAGELIST ShellSmallIconList;
extern HIMAGELIST ShellBigIconList; extern HIMAGELIST ShellBigIconList;
extern HDPA sic_hdpa; extern HDPA sic_hdpa;
...@@ -98,6 +97,7 @@ LPSHELLVIEW IShellView_Constructor(LPSHELLFOLDER); ...@@ -98,6 +97,7 @@ LPSHELLVIEW IShellView_Constructor(LPSHELLFOLDER);
HRESULT WINAPI IFSFolder_Constructor(IUnknown * pUnkOuter, REFIID riid, LPVOID * ppv); HRESULT WINAPI IFSFolder_Constructor(IUnknown * pUnkOuter, REFIID riid, LPVOID * ppv);
HRESULT WINAPI IShellLink_Constructor(IUnknown * pUnkOuter, REFIID riid, LPVOID * ppv); HRESULT WINAPI IShellLink_Constructor(IUnknown * pUnkOuter, REFIID riid, LPVOID * ppv);
HRESULT WINAPI ISF_Desktop_Constructor(IUnknown * pUnkOuter, REFIID riid, LPVOID * ppv); HRESULT WINAPI ISF_Desktop_Constructor(IUnknown * pUnkOuter, REFIID riid, LPVOID * ppv);
HRESULT WINAPI ISF_MyComputer_Constructor(IUnknown * pUnkOuter, REFIID riid, LPVOID * ppv);
/* kind of enumidlist */ /* kind of enumidlist */
#define EIDL_DESK 0 #define EIDL_DESK 0
...@@ -195,4 +195,22 @@ inline static BOOL SHELL_OsIsUnicode(void) ...@@ -195,4 +195,22 @@ inline static BOOL SHELL_OsIsUnicode(void)
return !(GetVersion() & 0x80000000); return !(GetVersion() & 0x80000000);
} }
#define __SHFreeAndNil(ptr) \
{\
SHFree(*ptr); \
*ptr = NULL; \
};
inline static void __SHCloneStrA(char ** target,const char * source)
{
*target = SHAlloc(strlen(source)+1); \
strcpy(*target, source); \
}
inline static void __SHCloneStrWtoA(char ** target, const WCHAR * source)
{
int len = WideCharToMultiByte(CP_ACP, 0, source, -1, NULL, 0, NULL, NULL);
*target = SHAlloc(len);
WideCharToMultiByte(CP_ACP, 0, source, -1, *target, len, NULL, NULL);
}
#endif #endif
...@@ -991,7 +991,6 @@ HRESULT WINAPI IShellLink_Constructor ( ...@@ -991,7 +991,6 @@ HRESULT WINAPI IShellLink_Constructor (
return E_NOINTERFACE; return E_NOINTERFACE;
} }
shell32_ObjCount++;
return S_OK; return S_OK;
} }
...@@ -1042,7 +1041,6 @@ static ULONG WINAPI IShellLinkA_fnAddRef(IShellLinkA * iface) ...@@ -1042,7 +1041,6 @@ static ULONG WINAPI IShellLinkA_fnAddRef(IShellLinkA * iface)
TRACE("(%p)->(count=%lu)\n",This,This->ref); TRACE("(%p)->(count=%lu)\n",This,This->ref);
shell32_ObjCount++;
return ++(This->ref); return ++(This->ref);
} }
/****************************************************************************** /******************************************************************************
...@@ -1054,7 +1052,6 @@ static ULONG WINAPI IShellLinkA_fnRelease(IShellLinkA * iface) ...@@ -1054,7 +1052,6 @@ static ULONG WINAPI IShellLinkA_fnRelease(IShellLinkA * iface)
TRACE("(%p)->(count=%lu)\n",This,This->ref); TRACE("(%p)->(count=%lu)\n",This,This->ref);
shell32_ObjCount--;
if (!--(This->ref)) if (!--(This->ref))
{ TRACE("-- destroying IShellLink(%p)\n",This); { TRACE("-- destroying IShellLink(%p)\n",This);
......
...@@ -37,6 +37,7 @@ ...@@ -37,6 +37,7 @@
#include "wine/debug.h" #include "wine/debug.h"
#include "shlwapi.h" #include "shlwapi.h"
#include "winuser.h" #include "winuser.h"
#include "debughlp.h"
WINE_DEFAULT_DEBUG_CHANNEL(shell); WINE_DEFAULT_DEBUG_CHANNEL(shell);
...@@ -57,8 +58,9 @@ IClassFactory * IDefClF_fnConstructor(LPFNCREATEINSTANCE lpfnCI, PLONG pcRefDll, ...@@ -57,8 +58,9 @@ IClassFactory * IDefClF_fnConstructor(LPFNCREATEINSTANCE lpfnCI, PLONG pcRefDll,
struct { struct {
REFIID riid; REFIID riid;
LPFNCREATEINSTANCE lpfnCI; LPFNCREATEINSTANCE lpfnCI;
} InterfaceTable[4] = { } InterfaceTable[5] = {
{&CLSID_ShellFSFolder, &IFSFolder_Constructor}, {&CLSID_ShellFSFolder, &IFSFolder_Constructor},
{&CLSID_MyComputer, &ISF_MyComputer_Constructor},
{&CLSID_ShellDesktop, &ISF_Desktop_Constructor}, {&CLSID_ShellDesktop, &ISF_Desktop_Constructor},
{&CLSID_ShellLink, &IShellLink_Constructor}, {&CLSID_ShellLink, &IShellLink_Constructor},
{NULL,NULL} {NULL,NULL}
...@@ -137,6 +139,9 @@ LRESULT WINAPI SHCoCreateInstance( ...@@ -137,6 +139,9 @@ LRESULT WINAPI SHCoCreateInstance(
BOOLEAN bLoadWithoutCOM = FALSE; BOOLEAN bLoadWithoutCOM = FALSE;
IClassFactory * pcf = NULL; IClassFactory * pcf = NULL;
if(!ppv) return E_POINTER;
*ppv=NULL;
/* if the clsid is a string, convert it */ /* if the clsid is a string, convert it */
if (!clsid) if (!clsid)
{ {
...@@ -145,8 +150,8 @@ LRESULT WINAPI SHCoCreateInstance( ...@@ -145,8 +150,8 @@ LRESULT WINAPI SHCoCreateInstance(
myclsid = &iid; myclsid = &iid;
} }
TRACE("(%p,\n\tCLSID:\t%s, unk:%p\n\tIID:\t%s,%p)\n", TRACE("(%p,%s,unk:%p,%s,%p)\n",
aclsid,debugstr_guid(myclsid),pUnkOuter,debugstr_guid(refiid),ppv); aclsid,shdebugstr_guid(myclsid),pUnkOuter,shdebugstr_guid(refiid),ppv);
/* we look up the dll path in the registry */ /* we look up the dll path in the registry */
__SHGUIDToStringW(myclsid, sClassID); __SHGUIDToStringW(myclsid, sClassID);
...@@ -173,11 +178,9 @@ LRESULT WINAPI SHCoCreateInstance( ...@@ -173,11 +178,9 @@ LRESULT WINAPI SHCoCreateInstance(
TRACE("WithoutCom=%u FromShell=%u\n", bLoadWithoutCOM, bLoadFromShell32); TRACE("WithoutCom=%u FromShell=%u\n", bLoadWithoutCOM, bLoadFromShell32);
/* now we create a instance */ /* now we create a instance */
*ppv=NULL;
if (bLoadFromShell32) { if (bLoadFromShell32) {
if (! SUCCEEDED(SHELL32_DllGetClassObject(myclsid, &IID_IClassFactory,(LPVOID*)&pcf))) { if (! SUCCEEDED(SHELL32_DllGetClassObject(myclsid, &IID_IClassFactory,(LPVOID*)&pcf))) {
ERR("LoadFromShell failed for CLSID=%s\n", debugstr_guid(myclsid)); ERR("LoadFromShell failed for CLSID=%s\n", shdebugstr_guid(myclsid));
} }
} else if (bLoadWithoutCOM) { } else if (bLoadWithoutCOM) {
...@@ -215,8 +218,8 @@ LRESULT WINAPI SHCoCreateInstance( ...@@ -215,8 +218,8 @@ LRESULT WINAPI SHCoCreateInstance(
end: end:
if(hres!=S_OK) if(hres!=S_OK)
{ {
ERR("failed (0x%08lx) to create \n\tCLSID:\t%s\n\tIID:\t%s\n", ERR("failed (0x%08lx) to create CLSID:%s IID:%s\n",
hres, debugstr_guid(myclsid), debugstr_guid(refiid)); hres, shdebugstr_guid(myclsid), shdebugstr_guid(refiid));
ERR("class not found in registry\n"); ERR("class not found in registry\n");
} }
...@@ -233,7 +236,7 @@ HRESULT WINAPI SHELL32_DllGetClassObject(REFCLSID rclsid, REFIID iid, LPVOID *pp ...@@ -233,7 +236,7 @@ HRESULT WINAPI SHELL32_DllGetClassObject(REFCLSID rclsid, REFIID iid, LPVOID *pp
IClassFactory * pcf = NULL; IClassFactory * pcf = NULL;
int i; int i;
TRACE("\n\tCLSID:\t%s,\n\tIID:\t%s\n",debugstr_guid(rclsid),debugstr_guid(iid)); TRACE("CLSID:%s,IID:%s\n",shdebugstr_guid(rclsid),shdebugstr_guid(iid));
if (!ppv) return E_INVALIDARG; if (!ppv) return E_INVALIDARG;
*ppv = NULL; *ppv = NULL;
...@@ -242,12 +245,12 @@ HRESULT WINAPI SHELL32_DllGetClassObject(REFCLSID rclsid, REFIID iid, LPVOID *pp ...@@ -242,12 +245,12 @@ HRESULT WINAPI SHELL32_DllGetClassObject(REFCLSID rclsid, REFIID iid, LPVOID *pp
for(i=0;InterfaceTable[i].riid;i++) { for(i=0;InterfaceTable[i].riid;i++) {
if(IsEqualIID(InterfaceTable[i].riid, rclsid)) { if(IsEqualIID(InterfaceTable[i].riid, rclsid)) {
TRACE("index[%u]\n", i); TRACE("index[%u]\n", i);
pcf = IDefClF_fnConstructor(InterfaceTable[i].lpfnCI, &shell32_ObjCount, NULL); pcf = IDefClF_fnConstructor(InterfaceTable[i].lpfnCI, NULL, NULL);
} }
} }
if (!pcf) { if (!pcf) {
FIXME("failed for CLSID=%s\n", debugstr_guid(rclsid)); FIXME("failed for CLSID=%s\n", shdebugstr_guid(rclsid));
return CLASS_E_CLASSNOTAVAILABLE; return CLASS_E_CLASSNOTAVAILABLE;
} }
...@@ -307,8 +310,7 @@ IMalloc * ShellTaskAllocator = NULL; ...@@ -307,8 +310,7 @@ IMalloc * ShellTaskAllocator = NULL;
*/ */
static HRESULT WINAPI IShellMalloc_fnQueryInterface(LPMALLOC iface, REFIID refiid, LPVOID *obj) static HRESULT WINAPI IShellMalloc_fnQueryInterface(LPMALLOC iface, REFIID refiid, LPVOID *obj)
{ {
TRACE("(%s,%p)\n",debugstr_guid(refiid),obj); TRACE("(%s,%p)\n",shdebugstr_guid(refiid),obj);
if (IsEqualIID(refiid, &IID_IUnknown) || IsEqualIID(refiid, &IID_IMalloc)) { if (IsEqualIID(refiid, &IID_IUnknown) || IsEqualIID(refiid, &IID_IMalloc)) {
*obj = (LPMALLOC) &Shell_Malloc; *obj = (LPMALLOC) &Shell_Malloc;
return S_OK; return S_OK;
...@@ -458,7 +460,6 @@ LPVOID WINAPI SHAlloc(DWORD len) ...@@ -458,7 +460,6 @@ LPVOID WINAPI SHAlloc(DWORD len)
if (!ShellTaskAllocator) SHGetMalloc(&ppv); if (!ShellTaskAllocator) SHGetMalloc(&ppv);
ret = (LPVOID) IMalloc_Alloc(ShellTaskAllocator, len); ret = (LPVOID) IMalloc_Alloc(ShellTaskAllocator, len);
if(ret) ZeroMemory(ret, len); /*FIXME*/
TRACE("%lu bytes at %p\n",len, ret); TRACE("%lu bytes at %p\n",len, ret);
return (LPVOID)ret; return (LPVOID)ret;
} }
...@@ -484,7 +485,7 @@ void WINAPI SHFree(LPVOID pv) ...@@ -484,7 +485,7 @@ void WINAPI SHFree(LPVOID pv)
DWORD WINAPI SHGetDesktopFolder(IShellFolder **psf) DWORD WINAPI SHGetDesktopFolder(IShellFolder **psf)
{ {
HRESULT hres = S_OK; HRESULT hres = S_OK;
TRACE("%p->(%p)\n",psf,*psf); TRACE("\n");
if(!psf) return E_INVALIDARG; if(!psf) return E_INVALIDARG;
*psf = NULL; *psf = NULL;
...@@ -493,7 +494,6 @@ DWORD WINAPI SHGetDesktopFolder(IShellFolder **psf) ...@@ -493,7 +494,6 @@ DWORD WINAPI SHGetDesktopFolder(IShellFolder **psf)
TRACE("-- %p->(%p)\n",psf, *psf); TRACE("-- %p->(%p)\n",psf, *psf);
return hres; return hres;
} }
/************************************************************************** /**************************************************************************
* Default ClassFactory Implementation * Default ClassFactory Implementation
* *
...@@ -534,7 +534,7 @@ IClassFactory * IDefClF_fnConstructor(LPFNCREATEINSTANCE lpfnCI, PLONG pcRefDll, ...@@ -534,7 +534,7 @@ IClassFactory * IDefClF_fnConstructor(LPFNCREATEINSTANCE lpfnCI, PLONG pcRefDll,
if (pcRefDll) InterlockedIncrement(pcRefDll); if (pcRefDll) InterlockedIncrement(pcRefDll);
lpclf->riidInst = riidInst; lpclf->riidInst = riidInst;
TRACE("(%p)\n\tIID:\t%s\n",lpclf, debugstr_guid(riidInst)); TRACE("(%p)%s\n",lpclf, shdebugstr_guid(riidInst));
return (LPCLASSFACTORY)lpclf; return (LPCLASSFACTORY)lpclf;
} }
/************************************************************************** /**************************************************************************
...@@ -545,7 +545,7 @@ static HRESULT WINAPI IDefClF_fnQueryInterface( ...@@ -545,7 +545,7 @@ static HRESULT WINAPI IDefClF_fnQueryInterface(
{ {
ICOM_THIS(IDefClFImpl,iface); ICOM_THIS(IDefClFImpl,iface);
TRACE("(%p)->(\n\tIID:\t%s)\n",This,debugstr_guid(riid)); TRACE("(%p)->(%s)\n",This,shdebugstr_guid(riid));
*ppvObj = NULL; *ppvObj = NULL;
...@@ -594,7 +594,7 @@ static HRESULT WINAPI IDefClF_fnCreateInstance( ...@@ -594,7 +594,7 @@ static HRESULT WINAPI IDefClF_fnCreateInstance(
{ {
ICOM_THIS(IDefClFImpl,iface); ICOM_THIS(IDefClFImpl,iface);
TRACE("%p->(%p,\n\tIID:\t%s,%p)\n",This,pUnkOuter,debugstr_guid(riid),ppvObject); TRACE("%p->(%p,%s,%p)\n",This,pUnkOuter,shdebugstr_guid(riid),ppvObject);
*ppvObject = NULL; *ppvObject = NULL;
...@@ -605,7 +605,7 @@ static HRESULT WINAPI IDefClF_fnCreateInstance( ...@@ -605,7 +605,7 @@ static HRESULT WINAPI IDefClF_fnCreateInstance(
return This->lpfnCI(pUnkOuter, riid, ppvObject); return This->lpfnCI(pUnkOuter, riid, ppvObject);
} }
ERR("unknown IID requested\n\tIID:\t%s\n",debugstr_guid(riid)); ERR("unknown IID requested %s\n",shdebugstr_guid(riid));
return E_NOINTERFACE; return E_NOINTERFACE;
} }
/****************************************************************************** /******************************************************************************
...@@ -640,8 +640,8 @@ HRESULT WINAPI SHCreateDefClassObject( ...@@ -640,8 +640,8 @@ HRESULT WINAPI SHCreateDefClassObject(
{ {
IClassFactory * pcf; IClassFactory * pcf;
TRACE("\n\tIID:\t%s %p %p %p \n\tIIDIns:\t%s\n", TRACE("%s %p %p %p %s\n",
debugstr_guid(riid), ppv, lpfnCI, pcRefDll, debugstr_guid(riidInst)); shdebugstr_guid(riid), ppv, lpfnCI, pcRefDll, shdebugstr_guid(riidInst));
if (! IsEqualCLSID(riid, &IID_IClassFactory) ) return E_NOINTERFACE; if (! IsEqualCLSID(riid, &IID_IClassFactory) ) return E_NOINTERFACE;
if (! (pcf = IDefClF_fnConstructor(lpfnCI, pcRefDll, riidInst))) return E_OUTOFMEMORY; if (! (pcf = IDefClF_fnConstructor(lpfnCI, pcRefDll, riidInst))) return E_OUTOFMEMORY;
......
...@@ -47,7 +47,12 @@ WINE_DEFAULT_DEBUG_CHANNEL(shell); ...@@ -47,7 +47,12 @@ WINE_DEFAULT_DEBUG_CHANNEL(shell);
HRESULT WINAPI StrRetToStrNA (LPVOID dest, DWORD len, LPSTRRET src, const ITEMIDLIST *pidl) HRESULT WINAPI StrRetToStrNA (LPVOID dest, DWORD len, LPSTRRET src, const ITEMIDLIST *pidl)
{ {
TRACE("dest=0x%p len=0x%lx strret=0x%p pidl=%p stub\n",dest,len,src,pidl); TRACE("dest=0x%p len=0x%lx strret=%p(%s) pidl=%p\n",
dest,len,src,
(src->uType == STRRET_WSTR) ? "STRRET_WSTR" :
(src->uType == STRRET_CSTR) ? "STRRET_CSTR" :
(src->uType == STRRET_OFFSET) ? "STRRET_OFFSET" : "STRRET_???",
pidl);
switch (src->uType) switch (src->uType)
{ {
...@@ -66,21 +71,23 @@ HRESULT WINAPI StrRetToStrNA (LPVOID dest, DWORD len, LPSTRRET src, const ITEMID ...@@ -66,21 +71,23 @@ HRESULT WINAPI StrRetToStrNA (LPVOID dest, DWORD len, LPSTRRET src, const ITEMID
default: default:
FIXME("unknown type!\n"); FIXME("unknown type!\n");
if (len) if (len) *(LPSTR)dest = '\0';
{
*(LPSTR)dest = '\0';
}
return(FALSE); return(FALSE);
} }
TRACE("-- %s\n", debugstr_a(dest) );
return S_OK; return S_OK;
} }
/************************************************************************/ /************************************************************************/
HRESULT WINAPI StrRetToStrNW (LPVOID dest1, DWORD len, LPSTRRET src, const ITEMIDLIST *pidl) HRESULT WINAPI StrRetToStrNW (LPVOID dest, DWORD len, LPSTRRET src, const ITEMIDLIST *pidl)
{ {
LPWSTR dest = (LPWSTR) dest1; TRACE("dest=0x%p len=0x%lx strret=%p(%s) pidl=%p\n",
TRACE("dest=0x%p len=0x%lx strret=0x%p pidl=%p stub\n",dest,len,src,pidl); dest,len,src,
(src->uType == STRRET_WSTR) ? "STRRET_WSTR" :
(src->uType == STRRET_CSTR) ? "STRRET_CSTR" :
(src->uType == STRRET_OFFSET) ? "STRRET_OFFSET" : "STRRET_???",
pidl);
switch (src->uType) switch (src->uType)
{ {
...@@ -91,23 +98,17 @@ HRESULT WINAPI StrRetToStrNW (LPVOID dest1, DWORD len, LPSTRRET src, const ITEMI ...@@ -91,23 +98,17 @@ HRESULT WINAPI StrRetToStrNW (LPVOID dest1, DWORD len, LPSTRRET src, const ITEMI
case STRRET_CSTR: case STRRET_CSTR:
if (!MultiByteToWideChar( CP_ACP, 0, src->u.cStr, -1, dest, len ) && len) if (!MultiByteToWideChar( CP_ACP, 0, src->u.cStr, -1, dest, len ) && len)
dest[len-1] = 0; ((LPWSTR)dest)[len-1] = 0;
break; break;
case STRRET_OFFSET: case STRRET_OFFSET:
if (pidl) if (!MultiByteToWideChar( CP_ACP, 0, ((LPCSTR)&pidl->mkid)+src->u.uOffset, -1, dest, len ) && len)
{ ((LPWSTR)dest)[len-1] = 0;
if (!MultiByteToWideChar( CP_ACP, 0, ((LPCSTR)&pidl->mkid)+src->u.uOffset, -1,
dest, len ) && len)
dest[len-1] = 0;
}
break; break;
default: default:
FIXME("unknown type!\n"); FIXME("unknown type!\n");
if (len) if (len) *(LPWSTR)dest = '\0';
{ *(LPSTR)dest = '\0';
}
return(FALSE); return(FALSE);
} }
return S_OK; return S_OK;
......
/*
* Virtual Folder
* common definitions
*
* Copyright 1997 Marcus Meissner
* Copyright 1998, 1999, 2002 Juergen Schmied
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
< * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
typedef struct {
int colnameid;
int pcsFlags;
int fmt;
int cxChar;
} shvheader;
#define GET_SHGDN_FOR(dwFlags) ((DWORD)dwFlags & (DWORD)0x0000FF00)
#define GET_SHGDN_RELATION(dwFlags) ((DWORD)dwFlags & (DWORD)0x000000FF)
LPCWSTR GetNextElementW (LPCWSTR pszNext, LPWSTR pszOut, DWORD dwOut);
HRESULT SHELL32_ParseNextElement (HWND hwndOwner, IShellFolder2 * psf, LPITEMIDLIST * pidlInOut, LPOLESTR szNext,
DWORD * pEaten, DWORD * pdwAttributes);
HRESULT SHELL32_GetItemAttributes (IShellFolder * psf, LPITEMIDLIST pidl, LPDWORD pdwAttributes);
HRESULT SHELL32_CoCreateInitSF (LPITEMIDLIST pidlRoot, LPITEMIDLIST pidlChild, REFCLSID clsid, REFIID iid,
LPVOID * ppvOut);
HRESULT SHELL32_CoCreateInitSFEx (LPITEMIDLIST pidlRoot, LPCSTR pathRoot, LPITEMIDLIST pidlChild, REFCLSID clsid,
REFIID iid, LPVOID * ppvOut);
HRESULT SHELL32_GetDisplayNameOfChild (IShellFolder2 * psf, LPCITEMIDLIST pidl, DWORD dwFlags, LPSTR szOut,
DWORD dwOutLen);
HRESULT SHELL32_BindToChild (LPCITEMIDLIST pidlRoot,
LPCSTR pathRoot, LPCITEMIDLIST pidlComplete, REFIID riid, LPVOID * ppvOut);
HRESULT SHELL32_CompareIDs (IShellFolder * iface, LPARAM lParam, LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2);
...@@ -169,7 +169,6 @@ IShellView * IShellView_Constructor( IShellFolder * pFolder) ...@@ -169,7 +169,6 @@ IShellView * IShellView_Constructor( IShellFolder * pFolder)
IShellFolder_QueryInterface(sv->pSFParent, &IID_IShellFolder2, (LPVOID*)&sv->pSF2Parent); IShellFolder_QueryInterface(sv->pSFParent, &IID_IShellFolder2, (LPVOID*)&sv->pSF2Parent);
TRACE("(%p)->(%p)\n",sv, pFolder); TRACE("(%p)->(%p)\n",sv, pFolder);
shell32_ObjCount++;
return (IShellView *) sv; return (IShellView *) sv;
} }
...@@ -1502,7 +1501,6 @@ static ULONG WINAPI IShellView_fnAddRef(IShellView * iface) ...@@ -1502,7 +1501,6 @@ static ULONG WINAPI IShellView_fnAddRef(IShellView * iface)
TRACE("(%p)->(count=%lu)\n",This,This->ref); TRACE("(%p)->(count=%lu)\n",This,This->ref);
shell32_ObjCount++;
return ++(This->ref); return ++(This->ref);
} }
/********************************************************** /**********************************************************
...@@ -1514,8 +1512,6 @@ static ULONG WINAPI IShellView_fnRelease(IShellView * iface) ...@@ -1514,8 +1512,6 @@ static ULONG WINAPI IShellView_fnRelease(IShellView * iface)
TRACE("(%p)->()\n",This); TRACE("(%p)->()\n",This);
shell32_ObjCount--;
if (!--(This->ref)) if (!--(This->ref))
{ {
TRACE(" destroying IShellView(%p)\n",This); TRACE(" destroying IShellView(%p)\n",This);
...@@ -1529,9 +1525,6 @@ static ULONG WINAPI IShellView_fnRelease(IShellView * iface) ...@@ -1529,9 +1525,6 @@ static ULONG WINAPI IShellView_fnRelease(IShellView * iface)
if (This->apidl) if (This->apidl)
SHFree(This->apidl); SHFree(This->apidl);
if (This->pCommDlgBrowser)
ICommDlgBrowser_Release(This->pCommDlgBrowser);
HeapFree(GetProcessHeap(),0,This); HeapFree(GetProcessHeap(),0,This);
return 0; return 0;
} }
...@@ -1733,7 +1726,9 @@ static HRESULT WINAPI IShellView_fnDestroyViewWindow(IShellView * iface) ...@@ -1733,7 +1726,9 @@ static HRESULT WINAPI IShellView_fnDestroyViewWindow(IShellView * iface)
} }
DestroyWindow(This->hWnd); DestroyWindow(This->hWnd);
IShellBrowser_Release(This->pShellBrowser); if(This->pShellBrowser) IShellBrowser_Release(This->pShellBrowser);
if(This->pCommDlgBrowser) ICommDlgBrowser_Release(This->pCommDlgBrowser);
return S_OK; return S_OK;
} }
...@@ -2272,4 +2267,3 @@ static struct ICOM_VTABLE(IViewObject) vovt = ...@@ -2272,4 +2267,3 @@ static struct ICOM_VTABLE(IViewObject) vovt =
ISVViewObject_SetAdvise, ISVViewObject_SetAdvise,
ISVViewObject_GetAdvise ISVViewObject_GetAdvise
}; };
...@@ -61,7 +61,6 @@ IContextMenu *ISvBgCm_Constructor(IShellFolder* pSFParent) ...@@ -61,7 +61,6 @@ IContextMenu *ISvBgCm_Constructor(IShellFolder* pSFParent)
if(pSFParent) IShellFolder_AddRef(pSFParent); if(pSFParent) IShellFolder_AddRef(pSFParent);
TRACE("(%p)->()\n",cm); TRACE("(%p)->()\n",cm);
shell32_ObjCount++;
return (IContextMenu*)cm; return (IContextMenu*)cm;
} }
...@@ -108,7 +107,6 @@ static ULONG WINAPI ISVBgCm_fnAddRef(IContextMenu *iface) ...@@ -108,7 +107,6 @@ static ULONG WINAPI ISVBgCm_fnAddRef(IContextMenu *iface)
TRACE("(%p)->(count=%lu)\n",This, This->ref); TRACE("(%p)->(count=%lu)\n",This, This->ref);
shell32_ObjCount++;
return ++(This->ref); return ++(This->ref);
} }
...@@ -132,8 +130,6 @@ static ULONG WINAPI ISVBgCm_fnRelease(IContextMenu *iface) ...@@ -132,8 +130,6 @@ static ULONG WINAPI ISVBgCm_fnRelease(IContextMenu *iface)
return 0; return 0;
} }
shell32_ObjCount--;
return This->ref; return This->ref;
} }
...@@ -428,4 +424,3 @@ static struct ICOM_VTABLE(IContextMenu) cmvt = ...@@ -428,4 +424,3 @@ static struct ICOM_VTABLE(IContextMenu) cmvt =
ISVBgCm_fnHandleMenuMsg, ISVBgCm_fnHandleMenuMsg,
(void *) 0xdeadbabe /* just paranoia (IContextMenu3) */ (void *) 0xdeadbabe /* just paranoia (IContextMenu3) */
}; };
...@@ -98,7 +98,6 @@ IContextMenu *ISvItemCm_Constructor(LPSHELLFOLDER pSFParent, LPCITEMIDLIST pidl, ...@@ -98,7 +98,6 @@ IContextMenu *ISvItemCm_Constructor(LPSHELLFOLDER pSFParent, LPCITEMIDLIST pidl,
TRACE("(%p)->()\n",cm); TRACE("(%p)->()\n",cm);
shell32_ObjCount++;
return (IContextMenu*)cm; return (IContextMenu*)cm;
} }
...@@ -145,7 +144,6 @@ static ULONG WINAPI ISvItemCm_fnAddRef(IContextMenu *iface) ...@@ -145,7 +144,6 @@ static ULONG WINAPI ISvItemCm_fnAddRef(IContextMenu *iface)
TRACE("(%p)->(count=%lu)\n",This, This->ref); TRACE("(%p)->(count=%lu)\n",This, This->ref);
shell32_ObjCount++;
return ++(This->ref); return ++(This->ref);
} }
...@@ -158,8 +156,6 @@ static ULONG WINAPI ISvItemCm_fnRelease(IContextMenu *iface) ...@@ -158,8 +156,6 @@ static ULONG WINAPI ISvItemCm_fnRelease(IContextMenu *iface)
TRACE("(%p)->()\n",This); TRACE("(%p)->()\n",This);
shell32_ObjCount--;
if (!--(This->ref)) if (!--(This->ref))
{ {
TRACE(" destroying IContextMenu(%p)\n",This); TRACE(" destroying IContextMenu(%p)\n",This);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment