Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

[C/C++] IShellFolder - Probleme de avec le Shell windows

2 réponses
Avatar
MrHanky
Bonjour,

Je viens d'ecrire une toute petite appli qui ne fonctionne correctement
que sous win XP, et je ne comprend pas pourquoi. L'instruction qui bloque le
tout est : GetDisplayNameOf(...) ( voir l'interface IShellFolder pour plus
d'info ). Sous WinXP, pas de pb, cette fonction marche tout le temps. Sous
95/98/Me, c'est une catastrophe, elle retourne des mauvais type de fichier
(un fichier a les meme attributs qu'un dossier). Puis en regardant dans Mes
Documents ou ailleur que dans le 'Desktop folder', on obtient que des noms
de fichier comme suit : '_ ' ou bien '_o ', rien d'autre, meme en créant un
répertoire vide (appelons le Nouveau Dossier), le nom retourné est '_ ',
bref, une vraie farce. Quelqu'un a une solution pour ca ? (En sachant qu'il
s'agit bien entendu du meme code pour les differents OS)

Sinon, quelqu'un aurait une solution miracle (du style tutorial/sample)
pour créer un folder tree (comme dans explorer) ? Ou un tutorial sur une
éventuelle interface qui implenterait ca ? Par exemple
IShellForlerTreeTheONeYouWereDreaming, ok, c'est utopique, mais y'a rien qui
existe dans ce style, un truc qui rependrait le code IE ?

MrHanky

2 réponses

Avatar
Christian ASTOR
MrHanky wrote:


Je viens d'ecrire une toute petite appli qui ne fonctionne correctement
que sous win XP, et je ne comprend pas pourquoi. L'instruction qui bloque le
tout est : GetDisplayNameOf(...) ( voir l'interface IShellFolder pour plus
d'info ). Sous WinXP, pas de pb, cette fonction marche tout le temps. Sous
95/98/Me, c'est une catastrophe, elle retourne des mauvais type de fichier
(un fichier a les meme attributs qu'un dossier). Puis en regardant dans Mes
Documents ou ailleur que dans le 'Desktop folder', on obtient que des noms
de fichier comme suit : '_ ' ou bien '_o ', rien d'autre



Tu dois t'emmêler les pinceaux avec les PIDL car ça a tjrs marché sous
tous les OS.
Un rapide ex sous Win 98, qui me ramène bien, à partir de "C:Mes
documents", tous les noms de fichiers et répertoires dans szDisplayName
(StrRetToBuf()) =>

char sPath[MAX_PATH];
SHGetSpecialFolderPath(NULL, sPath, CSIDL_PERSONAL, 0);
HRESULT hr;
LPMALLOC lpMalloc=0;
hr=SHGetMalloc(&lpMalloc);
LPSHELLFOLDER lpsf;
hr = SHGetDesktopFolder(&lpsf);
LPITEMIDLIST pidl;
// GetPIDLFromPath() déjà posté...
if(SUCCEEDED(GetPIDLFromPath( sPath, &pidl)))
{
LPSHELLFOLDER lpsfolder;
hr = lpsf->BindToObject(pidl, NULL, IID_IShellFolder,(LPVOID*)&lpsfolder);
lpsf->Release();
lpMalloc->Free(pidl);
LPENUMIDLIST lpenumidl = NULL;
hr = lpsfolder->EnumObjects(NULL, SHCONTF_FOLDERS |
SHCONTF_NONFOLDERS, &lpenumidl);
lpsfolder->Release();
if (SUCCEEDED(hr))
{
LPITEMIDLIST lpidl=0;
ULONG ulFetched;
while (S_OK==lpenumidl->Next(1,&lpidl, &ulFetched))
{
STRRET strDispName;
TCHAR szDisplayName[MAX_PATH];
hr = lpsfolder->GetDisplayNameOf(lpidl, SHGDN_INFOLDER, &strDispName);
hr = StrRetToBuf(&strDispName, lpidl, szDisplayName,
sizeof(szDisplayName));
lpMalloc->Free(lpidl);

}
}
}


Sinon, quelqu'un aurait une solution miracle (du style tutorial/sample)
pour créer un folder tree (comme dans explorer) ?



MSDN => Enumdesk.c et autres ex.
Avatar
MrHanky
Merci Christian pour cette réponse très complète. En lisant ton code, je
me suis apercu que j'avais la meme chose :-( - Mais en relisant de plus
pres, j'ai repéré un copier/coller qui avait mal tourné, le pb etait bidon.
Donc moi etre heureux. Et moi remercier toi beaucoup beaucoup, vu que moi
étais a la limite de jetter mon bureau par la fenetre.
C'est quand meme dramatique de perdre autant de temps sur la prog win32,
ca me désole de plus en plus.

Mr Hanky, qui a les doigts dedant.

"Christian ASTOR" a écrit dans le message de
news:3fa6bf1e$0$6980$
MrHanky wrote:


> Je viens d'ecrire une toute petite appli qui ne fonctionne


correctement
> que sous win XP, et je ne comprend pas pourquoi. L'instruction qui


bloque le
> tout est : GetDisplayNameOf(...) ( voir l'interface IShellFolder pour


plus
> d'info ). Sous WinXP, pas de pb, cette fonction marche tout le temps.


Sous
> 95/98/Me, c'est une catastrophe, elle retourne des mauvais type de


fichier
> (un fichier a les meme attributs qu'un dossier). Puis en regardant dans


Mes
> Documents ou ailleur que dans le 'Desktop folder', on obtient que des


noms
> de fichier comme suit : '_ ' ou bien '_o ', rien d'autre

Tu dois t'emmêler les pinceaux avec les PIDL car ça a tjrs marché sous
tous les OS.
Un rapide ex sous Win 98, qui me ramène bien, à partir de "C:Mes
documents", tous les noms de fichiers et répertoires dans szDisplayName
(StrRetToBuf()) =>

char sPath[MAX_PATH];
SHGetSpecialFolderPath(NULL, sPath, CSIDL_PERSONAL, 0);
HRESULT hr;
LPMALLOC lpMalloc=0;
hr=SHGetMalloc(&lpMalloc);
LPSHELLFOLDER lpsf;
hr = SHGetDesktopFolder(&lpsf);
LPITEMIDLIST pidl;
// GetPIDLFromPath() déjà posté...
if(SUCCEEDED(GetPIDLFromPath( sPath, &pidl)))
{
LPSHELLFOLDER lpsfolder;
hr = lpsf->BindToObject(pidl, NULL, IID_IShellFolder,(LPVOID*)&lpsfolder);
lpsf->Release();
lpMalloc->Free(pidl);
LPENUMIDLIST lpenumidl = NULL;
hr = lpsfolder->EnumObjects(NULL, SHCONTF_FOLDERS |
SHCONTF_NONFOLDERS, &lpenumidl);
lpsfolder->Release();
if (SUCCEEDED(hr))
{
LPITEMIDLIST lpidl=0;
ULONG ulFetched;
while (S_OK==lpenumidl->Next(1,&lpidl, &ulFetched))
{
STRRET strDispName;
TCHAR szDisplayName[MAX_PATH];
hr = lpsfolder->GetDisplayNameOf(lpidl, SHGDN_INFOLDER, &strDispName);
hr = StrRetToBuf(&strDispName, lpidl, szDisplayName,
sizeof(szDisplayName));
lpMalloc->Free(lpidl);

}
}
}

>
> Sinon, quelqu'un aurait une solution miracle (du style


tutorial/sample)
> pour créer un folder tree (comme dans explorer) ?

MSDN => Enumdesk.c et autres ex.