Click to See Complete Forum and Search --> : Help with IShellFolder::GetDisplayNameOf


tc31415
May 19th, 2006, 10:25 AM
Hi :) !
I'm trying to create "browse for folder" in treeview like in WindowsExplorer. Everything work ok but when i want to get full path to folder:

1. When select folder GetDisplayNameOf() return text with double name like:
C:\WINDOWS\WINDOWS
\\Computer\path\folder\folder
2. When select Local Disk ( like "Local Disc (C: )" ) GetDisplayNameOf() return error

Can you help me :( ? Here is little part of my source. I hope it is enough:

char txtBuf[MAX_PATH];
typedef struct {
BOOL bRoot;
LPITEMIDLIST lpi;
LPSHELLFOLDER lpsfParent;
LPITEMIDLIST lpifq;
} LPTVITEMDATA;

BOOL GetName(LPSHELLFOLDER lpsf,LPITEMIDLIST lpi,DWORD dwFlags,LPSTR lpFriendlyName) {
BOOL bSuccess = TRUE;
STRRET str;

if(NOERROR == lpsf->GetDisplayNameOf(lpi,dwFlags,&str)) {
...
}
else bSuccess = FALSE;
return bSuccess;
}

void GetItemPath(TV_ITEM tvi) {
LPMALLOC pMalloc;
LPTVITEMDATA* lptvid=NULL;
IShellFolder *psfProgFiles=NULL;

if(FAILED(SHGetMalloc(&pMalloc))) return;
lptvid = (LPTVITEMDATA*) pMalloc->Alloc(sizeof (LPTVITEMDATA));
if(!lptvid) {pMalloc->Release();return;}
lptvid=(LPTVITEMDATA*)tvi.lParam;
if(!lptvid) {pMalloc->Release();return;}
if(lptvid->bRoot) psfProgFiles=lptvid->lpsfParent;
else {
if(FAILED(lptvid->lpsfParent->BindToObject(lptvid->lpi,
NULL,IID_IShellFolder,
(LPVOID *)&psfProgFiles)))
{pMalloc->Release();return;}
}
GetName(psfProgFiles,lptvid->lpi,SHGDN_FORPARSING,txtBuf);
pMalloc->Release();
}

//----- In WndProcedure ---------------
...
case WM_NOTIFY:
switch(((NMHDR*)lParam)->idFrom) {
case ID_TREEVIEW:
tvItem=((NM_TREEVIEW*)lParam)->itemNew;
...
if(((NMHDR *)lParam)->code==TVN_SELCHANGING) {
GetItemPath(tvItem);
SendMessage(hStatus,SB_SETTEXT,0,(LPARAM)txtBuf);
}
...
break;
}
break;
// ...

Thanks in advance :( :) !

tc31415
May 23rd, 2006, 09:26 AM
So ... I solve the problem. Everything is perfect. But i don't know why :(. However - this is solution:

In function GetItemPath() this line:
GetName(psfProgFiles,lptvid->lpi,SHGDN_FORPARSING,txtBuf);
must be:
GetName(psfProgFiles,NULL,SHGDN_FORPARSING,txtBuf);

LPITEMIDLIST lptvid->lpi must be NULL ...

This Thread is closed, unless someone answer WHY?

Nevertheless ( nobody help so far ) thanks!