Write problem with MS Office 2003
Stefan Dösinger
stefandoesinger at gmx.at
Wed May 25 13:38:10 CDT 2005
Hi,
> Hi Stefan,
>
> On Wednesday 25 May 2005 18:13, Stefan Dösinger wrote:
> > Any suggestions to the following patch?
>
> + SHELL32_GetItemAttributes (_IShellFolder_ (This), This->pidlRoot,
> &dwAttributes);
>
> This->pidlRoot is the ITEMIDLIST of all SHITEMIDs starting from the root of
> the shell namespace up to the current folder. If you take a look into
> SHELL32_GetItemAttributes, it calls _ILIsDrive, _ILGetGUIDPointer and the
> like on the pidl. Those function inspect the first SHITEMID in the
> ITEMIDLIST only (see pidl.c). This means they will inspect the SHITEMID
> which represents the drive, which the ITEMIDLIST ist based on.
Just a question if I understood that correctly
So PidlRoot represents a list of Folders, from the root to the current folder.
For C:\somedir\dirx this would more or less mean
C:\
somedir\
dirx\
(or even starting from Desktop. Msdn somewhere mentiones the Shell namespace)
> What you really need to do is to call SHBindToParent. This will give you a
> pointer to the current folders parent folder as well as the last SHITEMID
> of the ITEMIDLIST. Call SHELL32_GetItemAttributes with the parent folder
> and this last SHITEMID.
Can I use pidlRoot(passed by the function caller) for SHBindToParent? Now I
have
SHBindToParent(This->pidlRoot, &IID_IShellFolder, (LPVOID*)&psfParent,
(LPCITEMIDLIST*)&rpidl);
later I call SHELL32_GetItemAttributes with SHELL32_GetItemAttributes
(psfParent, rpidl, (DWORD *) &This->dwAttributes);
This causes I crash. If I understand correctly, I have to set the flags I want
to test in This->dwAttributes before I call SHELL32_GetItemAttributes. If I
set it to 0xffffffff(I want to test for all flags) of all flags listed as
supported flags in shfolder.c, I get 0xf0000144(the flags a drive supports,
oh, surprise) every time and a stack overflow later on.
> As to the caching of the file attributes: Those are already cached in the
> SHITEMID (see _ILGetFileAttributes in pidl.c). So you are adding a redundant
> level of caching and thus unnecessary complexity. IMHO it would be better to
> remove the IGenericFSImpl's dwAttributes member and just call
> SHELL32_GetItemAttributes.
You mean that I can pass &This->dwAttributes directly to
SHELL32_GetItemAttributes?
Thanks for your help,
Stefan
PS:
A summary of the relevan lines:
(The modified function is IFSFldr_PersistFolder3_InitializeEx)
hr = SHBindToParent(This->pidlRoot, &IID_IShellFolder,
(LPVOID*)&psfParent, (LPCITEMIDLIST*)&rpidl);
if(SUCCEEDED(hr))
{
This->dwAttributes = 0xffffffff;
SHELL32_GetItemAttributes (psfParent, rpidl, (DWORD *)
&This->dwAttributes);
ERR("Attribs: 0x%08lx\n", (DWORD) This->dwAttributes);
}
else
This->dwAttributes = 0;
This->PidlRoot is set by existing code to ILClone (pidlRoot), and pidlRoot is
a parameter to the function.
More information about the wine-devel
mailing list